题目:二叉树的层次遍历(力扣102)
题目描述:
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
解题思路:
提供两种实现方案:
(1) 广度优先搜索
(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>> list=new ArrayList<>();
//代码的鲁棒性
if(root==null) {
return list;
}
//用队列进行按层打印,将每一层节点的左孩子和右孩子放在队列的最后面
Deque<TreeNode> deq=new LinkedList<TreeNode>();
deq.add(root);
while(!deq.isEmpty()) {
//存储当前层的节点值
List<Integer> al=new ArrayList<>();
//当前层节点的个数
int size=deq.size();
for(int i=0;i<size;i++) {
TreeNode node= deq.poll();
al.add(node.val);
//加入该节点的左孩子
if(node.left!=null) {
deq.add(node.left);
}
//加入该节点的右孩子
if(node.right!=null) {
deq.add(node.right);
}
}
list.add(al);
}
return list;
}
}
第二种解题思路:深度优先搜素(力扣官方解题思路)
递归算法
最简单的解法就是递归,首先确认树非空,然后调用递归函数 helper(node, level),参数是当前节点和节点的层次。程序过程如下:
输出列表称为 levels,当前最高层数就是列表的长度 len(levels)。比较访问节点所在的层次 level 和当前最高层次 len(levels) 的大小,如果前者更大就向 levels 添加一个空列表。
将当前节点插入到对应层的列表 levels[level] 中。
递归非空的孩子节点:helper(node.left / node.right, level + 1)。
代码实现:
/**
* 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=new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
if(root==null) {
return list;
}
//提供一个方法:传进去的参数为当前节点和当前节点所处的二叉树深度(level)
helper(root,0);
return list;
}
private void helper(TreeNode node, int level) {
//当前层的level=list.size()时,说明深度有增加了,所以要添加此时的层存储容器
if(list.size()==level) {
list.add(new ArrayList<Integer>());
}
//在深度相同的位置,加入元素
list.get(level).add(node.val);
//左孩子,level+1
if(node.left!=null) {
helper(node.left,level+1);
}
//右孩子,level+1
if(node.right!=null) {
helper(node.right,level+1);
}
}
}