leetcode429. N-ary Tree Level Order Traversal

栏目: 编程工具 · 发布时间: 5年前

内容简介:对N叉树进行水平遍历,并输出每一行遍历的结果。这个和一般的水平遍历有所区别,因为它会记录每一行的水平遍历结果分别存在结果数组相应行。因此首先可以用水平遍历的通用解法,即队列的方式,进行解决:

题目要求

Given an n-ary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example, given a 3-ary tree:

leetcode429. N-ary Tree Level Order Traversal

We should return its level order traversal:

[
     [1],
     [3,2,4],
     [5,6]
]
 

Note:

The depth of the tree is at most 1000.
The total number of nodes is at most 5000.

对N叉树进行水平遍历,并输出每一行遍历的结果。

思路和代码

这个和一般的水平遍历有所区别,因为它会记录每一行的水平遍历结果分别存在结果数组相应行。因此首先可以用水平遍历的通用解法,即队列的方式,进行解决:

public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(root != null) {
            LinkedList<Node> queue = new LinkedList<Node>();
            queue.offer(root);
            //下一行的元素数量
            int next = 1;
            List<Integer> levelOrderPerHeight = new ArrayList<Integer>();
            while(!queue.isEmpty()) {
                next--;
                Node tmp = queue.poll();
                levelOrderPerHeight.add(tmp.val);
                if(tmp.children != null && !tmp.children.isEmpty()) {
                    for(Node child : tmp.children) {
                        queue.offer(child);
                    }
                }
                //当前行遍历完成,则更新当前行
                if(next == 0) {
                    result.add(levelOrderPerHeight);
                    levelOrderPerHeight = new ArrayList<Integer>();
                    next = queue.size();
                }
            }
        }
        return result;
    }

上面的实现中使用next值来记录下一行的元素的个数。但是其实因为结果是采用List<List>的形式来记录的,也就是第i层的水平遍历的结果会记录于数组下标i-1的位置上。因此无需再用队列来额外存储每一行的水平遍历,可以直接通过递归将遍历结果插入到相应行的结果集中。

public List<List<Integer>> levelOrder2(Node root) { 
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        levelOrder(root, result, 0);
        return result;
    }
    
    public void levelOrder(Node root, List<List<Integer>> result, int level) {
        if(root == null) return;
        if(level == result.size()) {
            result.add(new ArrayList<>());
        }
        List<Integer> tmp = result.get(level);
        tmp.add(root.val);
        for(Node child : root.children) {
            levelOrder(child, result, level+1);
        }
    }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Modeling the Internet and the Web

Modeling the Internet and the Web

Pierre Baldi、Paolo Frasconi、Padhraic Smyth / Wiley / 2003-7-7 / USD 115.00

Modeling the Internet and the Web covers the most important aspects of modeling the Web using a modern mathematical and probabilistic treatment. It focuses on the information and application layers, a......一起来看看 《Modeling the Internet and the Web》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具