剑指 Offer 32 - II. 从上到下打印二叉树 II
难度简单143
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
提示:
节点总数 <= 1000
题目的整体思路和剑指 Offer 32 - I. 从上到下打印二叉树完全一致,只是在整体的流程控制中加了一些细节,就是在遍历新的一层的时候先统计队列中元素的个数并记录下来。这就是这层的所有节点个数,然后把遍历这些节点的值,依此放入一个数组中,当遍历完这层时,再将这个数组作为一个元素加入一个数组中。
举例说明:
初始状态,队列中只有一个root节点
因为size=1,所以在遍历一个节点后,立刻将数组作为元素加入大的数组中:
再次统计队列内元素个数,得到size=2,说明遍历两个节点后,将当前数组加入到大的数组中
然后重复:统计栈内元素个数,挨个遍历将节点的值加入数组中,然后再将数组作为节点加入大的数组中
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null){return res;}
Queue<TreeNode> que = new LinkedList<TreeNode>();
que.offer(root);
while(!que.isEmpty()){
ArrayList<Integer> arr = new ArrayList<Integer>();
int size = que.size();
for(int i = 0 ;i < size; i++){
TreeNode now = que.poll();
arr.add(now.val);
if(now.left != null){que.offer(now.left);}
if(now.right != null){que.offer(now.right);}
}
res.add(arr);
}
return res;
}
}
要点:
-
List<List> res = new ArrayList<>();
嵌套集合类型的写法要注意
-
临时数组arr 和 统计变量 size要写在while循环内 && for循环外
-
遍历完一层的所有节点后 记得要将临时数组加入结果数组中