leetcode429. N-ary Tree Level Order Traversal

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

内容简介:对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);
        }
    }

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

查看所有标签

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

十亿美金的教训

十亿美金的教训

林军 唐宏梅 / 浙江大学出版社 / 2011-5 / 39.00元

《十亿美金的教训》内容简介:创业者个人能力欠缺、团队涣散、经营方向把握不当、资金动用失措以及时局不利……这其中有哪一个细节被忽视,都可能是失败的导火索! 国内二十年互联网风云,有人成功,有人失败。两种结果,不同方向,却往往只是一线之隔。他们留给我们怎样的教训与启示?后来者要怎样才能跳出失败之殇? 《十亿美金的教训》选取了互联网十个经典的失败案例,并深层解读这些互联网企业与创业者们从成功......一起来看看 《十亿美金的教训》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具