102. 二叉树的层次遍历

2019/02/01 15:24 下午 posted in  LeetCode

https://leetcode-cn.com/problems/binary-tree-level-order-traversal/description/

题目

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:

给定二叉树:  [3,9,20,null,null,15,7],


    3
   / \
  9  20
    /  \
   15   7
   

返回其层次遍历结果:

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

解题思路:

层次遍历,没啥好说的,就是本题需要将层次区分开来。因此传统的方法,需要做一些修订。用一个队列保存当前层次的所有节点。

每一轮遍历的时候,依次出队所有的节点,存入结果,并遍历出队的所有节点,如果有子节点则存入队列,等待下一轮遍历。

也就是有两层的遍历,用一个临时的队列,保存中间结果

代码:

public List<List<Integer>> levelOrder(TreeNode root) {
    Queue<TreeNode> queue = new ArrayDeque<>();
    if (root != null) {
        queue.add(root);
    }
    List<List<Integer>> result = new ArrayList<>();
    while(!queue.isEmpty()){
        List<Integer> ans = new ArrayList<>();
        Queue<TreeNode> tempQueue = new ArrayDeque<>(queue);
        while (!tempQueue.isEmpty()){
            TreeNode node = tempQueue.poll();
            ans.add(node.val);
        }
        tempQueue = new ArrayDeque<>(queue);
        queue.clear();
        while(!tempQueue.isEmpty()){
            TreeNode node = tempQueue.poll();
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
        result.add(ans);
    }
    return result;
}