乐趣区

leetcode429-Nary-Tree-Level-Order-Traversal

题目要求

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:

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);
        }
    }
退出移动版