剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
提示:
节点总数 <= 1000
注意:
本题与主站 102 题相同:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
解法一:分层记录。
与上题32 - I. 从上到下打印二叉树完全类似,只是要分层记录而已。
关键在于理解代码中的一句注释:每轮首次进入while循环时,队列中已有的节点是同一层的
Java代码
/**
* 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> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty())
{
//每轮首次进入while循环时,队列中已有的节点是同一层的
int queue_length = queue.size();
List<Integer> list = new ArrayList<>();//用于放一层的节点
for(int i = 0; i < queue_length;i++){
TreeNode node = queue.poll();
list.add(node.val);
//将下一层的非空节点入队
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
res.add(list);
}
return res;
}
}
解法二:带参递归方式
直接使用二叉树前序遍历
的递归
形式即可,只是递归的时候,要多传一个参数,就是该节点属于第几层的
,很简单,子节点所在层数是父节点所在层数加一。
Java代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//由于要在递归中将结果添加到一个List<List<Integer>>中,为了方便,可将其定义为成员字段
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
if(root == null) return res;
preOrder(root,0);//根节点在第0层
return res;
}
//定义一个前序遍历二叉树的函数
public void preOrder(TreeNode node,int level){
if(res.size() == level){
//如果level是新层,则在res中继续添加一个List<Integer>用于存这一层的结点的值
res.add(new ArrayList<>());
}
//将结点的值添加到res中对应的层的List<Integer>中
res.get(level).add(node.val);
//递归遍历左右子节点
if(node.left != null){
preOrder(node.left,level + 1);
}
if(node.right!=null){
preOrder(node.right,level + 1);
}
}
}