LeetCode - 102. 二叉树的层序遍历

132 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


原题:102. 二叉树的层序遍历

也就是把这样一个二叉树:

    3
   / \
  9  20
    /  \
   15   7

转变成这样:

[
  [3],
  [9,20],
  [15,7]
]

解题思路:

这道题其实是二叉树的广度优先遍历,除了广度优先遍历整个二叉树意外,需要解决的问题就是把所有的元素按层分组。

广度优先遍历的大概思路是这样的:创建一个队列(或者类似的数据结构),从根节点开始,每当遍历到一个节点,就把它的子节点依次放入队列中,然后从队列中依次取出节点,进行同样的操作,将每次去到的节点的字节点都依次放入队列中。当队列中的节点都被取完之后,二叉树的广度优先遍历就完成了。

这道题要求的结果中,需要把每一层的元素分组成单独的数组。我们可以这样做:首先,跟节点为第一层,开始的时候,先把跟节点放入队列。然后在队列不为空的条件下进行循环,每次循环开始,都先获取队列的长度,这个长度就是当前层的节点的个数,比如第一次循环的时候,之后跟节点,长度为1,知道这个长度(假设为 n)后,每次只取队列中前 n 个节点,这些节点就是当层所有的节点,取完之后队列中还剩下的节点就是下一层所有的节点。以此类推,当队列中没有节点之后,就遍历完了所有的节点。在每次循环时,创建一个列表保存当前层的所有元素,循环的最后再将其添加入最终的结果结果集列表中。

最终代码:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if (root == null) {
            return result;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            List<Integer> level = new ArrayList<Integer>();
            int currentLevelSize = queue.size();
            for (int i = 1; i <= currentLevelSize; i++) {
                TreeNode node = queue.poll();
                level.add(node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            result.add(level);
        }
        return result;
    }
}