1.原题
链接:https://leetcode.com/problems/binary-tree-level-order-traversal/
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,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
2.题目大意
从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序。
3.解题思路
这是一道宽度搜索的题。从树的根结点出发,为了能打印该根结点的两个子结点,需要在遍历根结点的时候,先把子结点保存到容器中,因为输出为从左到右,则可利用队列的先进先出性质,按左结点、右结点的顺序存入,也按左结点、右结点的顺序取出。因此,打印的规律为:首先存入根节点,此时队列的大小为第一层的结点个数,则只从队列取出当前队列大小个数的结点打印,且每次打印一个结点时,如果该结点有子结点,则把子结点放入队列的末尾;同理,打印第二层结点时,此时队列存的是第二层结点,则打印第二层结点时,只从队列取出当前队列大小个数的结点打印,且每次打印一个结点时,如果该结点有子结点,则把子结点放入队列的末尾。重复上述打印操作。
4.java代码实现
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new LinkedList<>();
if (root == null)
return res;
queue.offer(root);
while (!queue.isEmpty()) {
//此size为树待遍历某层的结点总数
int size = queue.size();
List<Integer> sub = new LinkedList<>();
for (int i = 0; i < size; i++) {
if (queue.peek().left != null)
queue.offer(queue.peek().left);
if (queue.peek().right != null)
queue.offer(queue.peek().right);
sub.add(queue.poll().val);
}
res.add(sub);
}
return res;
}