题目描述
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
分析
1. 通过统计每一行的结点数
定义两个变量,toBePrinted和nextLevel。
toBePrinted:当前待打印结点的数量
nextLevel:下一层的结点数量
通过Deque来进行统计。
2. 插入特殊结点
参考自:Binary Tree Level Order Traversal
通过插入特殊结点,来判断一层是否结束。这样做的好处是不用统计每一层结点数目。伪代码如下:
a queue stores [step0, step1, step2, ...]
queue.add(first step)
while queue is not empty
current_step = queue.poll()
// do something here with current_step
// like counting
foreah step in current_step can jump to
queue.add(step)
代码
代码1:通过统计每一行的结点数:
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (root == null) {
return result;
}
Deque<TreeNode> deque = new LinkedList<TreeNode>();
deque.add(root);
int toBePrinted = 1;
int nextLevel = 0;
List<Integer> level = new LinkedList<Integer>();
while (!deque.isEmpty()) {
TreeNode p = deque.poll();
level.add(p.val);
toBePrinted--;
if (p.left != null) {
deque.addLast(p.left);
nextLevel++;
}
if (p.right != null) {
deque.addLast(p.right);
nextLevel++;
}
if (toBePrinted == 0) {
toBePrinted = nextLevel;
nextLevel = 0;
result.add(new ArrayList<Integer>(level));
level.clear();
}
}
return result;
}
代码2:插入特殊结点:
public static List<List<Integer>> levelOrder2(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (root == null) {
return result;
}
final TreeNode END = new TreeNode(0);
Deque<TreeNode> deque = new LinkedList<TreeNode>();
List<Integer> level = new LinkedList<Integer>();
deque.add(root);
deque.add(END);
while (!deque.isEmpty()) {
TreeNode p = deque.pop();
if (p == END) {
result.add(new ArrayList<Integer>(level));
level.clear();
if (!deque.isEmpty()) {
deque.add(END);
}
} else {
level.add(p.val);
if (p.left != null) {
deque.add(p.left);
}
if (p.right != null) {
deque.add(p.right);
}
}
}
return result;
}