求二叉树的层序遍历
题目描述
思路
方法返回的是一个==二维集合(java常用集合,少用数组)==,可以类比数组进行操作
按行遍历的关键是每一行的深度对应了它输出在二维数组中的深度,即深度可以与二维数组的下标对应,那我们可以在递归的访问每个节点的时候记录深度depth
因此可以用递归实现:
- 终止条件: 遍历到了空节点,就不再继续,返回。
- 返回值: 将加入的输出数组中的结果往上返回。
- 本级任务: 处理按照上述思路处理非空节点,并进入该节点的子节点作为子问题。
步骤
- ,创建二维集合,判断头结点是否为空,为空直接返回
- 传入root,深度为1,进行层序遍历
- 新的节点判断不为null,则判断res在这一层是否已经添加过元素,==没有添加==,则创建一个新的集合记录第一个访问的值,并添加到二维集合中,如果已经添加过元素,则从二维集合中取出这一层的集合,并将当前节点值添加进这一层的集合
- 递归进行层序遍历,递归时左右深度加1,表示遍历新的一层
代码
import java.util.*;
public class Solution {
//记录输出
ArrayList<ArrayList<Integer> > res = new ArrayList();
void traverse(TreeNode root, int depth) {
if(root != null){
//新的一层
if(res.size() < depth){
ArrayList<Integer> row = new ArrayList();
res.add(row);
row.add(root.val);
//读取该层的一维数组,将元素加入末尾
}else{
ArrayList<Integer> row = res.get(depth - 1);
row.add(root.val);
}
}
else
return;
//递归左右时深度记得加1
traverse(root.left, depth + 1);
traverse(root.right, depth + 1);
}
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
if(root == null)
//如果是空,则直接返回
return res;
//递归层次遍历
traverse(root, 1);
return res;
}
}
总结
- java中多用集合来进行操作,课类比c语言中的数组
- 每一行的深度对应二维数组中的深度,但是变量depth不发生根本性的改变,从而在不是第一次给这一层集合添加元素时,可以取出对应层数的集合
- ==关于空指针异常==,除了递归时传参的的节点的后继节点调用不需要判空,其他的传入的节点都需要判空,如果想在程序中调用当前节点的后继节点也需要对后继节点判空