69 · Binary Tree Level Order Traversal - LintCode
# Description
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).)
# Example
Example 1:
Input:
tree = {1,2,3}
Output:
[[1],[2,3]]
Explanation:
1
/ \
2 3
it will be serialized {1,2,3}
Example 2:
Input:
tree = {1,#,2,3}
Output:
[[1],[2],[3]]
# Solution
copy from leetcode:
题目要求我们一层一层输出树的结点的值,很明显需要使用「广度优先遍历」实现;
广度优先遍历借助「队列」实现;
注意:
这样写 for (int i = 0; i < queue.size(); i++) { 代码是不能通过测评的,这是因为 queue.size() 在循环中是变量(这条规则在 Python 中不成立,请各位读者自行验证)。正确的做法是:每一次在队列中取出元素的个数须要先暂存起来,请见参考代码;
子结点入队的时候,非空的判断很重要:在队列的队首元素出队的时候,一定要在左(右)子结点非空的时候才将左(右)子结点入队。
树的广度优先遍历的写法模式相对固定:
使用队列;
在队列非空的时候,动态取出队首元素;
取出队首元素的时候,把队首元素相邻的结点(非空)加入队列。
- 时间复杂度:O(N)O(N),这里 NN 是二叉树结点的个数,每个结点都访问一次,因此时间复杂度是 O(N)O(N);
- 空间复杂度:O(N)O(N)。
/** | |
* Definition of TreeNode: | |
* public class TreeNode { | |
* public int val; | |
* public TreeNode left, right; | |
* public TreeNode(int val) { | |
* this.val = val; | |
* this.left = this.right = null; | |
* } | |
* } | |
*/ | |
public class Solution { | |
/** | |
* @param root: A Tree | |
* @return: Level order a list of lists of integer | |
*/ | |
public List<List<Integer>> levelOrder(TreeNode root) { | |
// 注意返回值 | |
List result = new ArrayList<>(); | |
if (root == null) return result; | |
Queue<TreeNode> queue = new LinkedList<>(); | |
//step 1:把 root 放進隊列 | |
queue.offer(root); | |
while (!queue.isEmpty()){ | |
//ArrayList 一定要在 while loop 裡建新,因為每次 level 都不一樣 | |
List<Integer> level = new ArrayList<>(); | |
// 取 Queue size,因為每一層都有不同的 node | |
// 把 size 放這裡,而不是 for loop 裡是因為會在 loop 裡放 node 的孩子,size 是變量 | |
int size = queue.size(); | |
// 遍歷 queue,樹的每一層 | |
for (int i = 0; i < size; i++){ | |
//poll 出來一個,看當前節點有沒有孩子,若有,就把它放到 queue | |
TreeNode node = queue.poll(); | |
// 把當前的 node.val 記下來 | |
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; | |
} | |
} |