Java同学的面试算法 5

68 阅读2分钟

求二叉树的层序遍历

题目描述

image-20231226205258030

思路

方法返回的是一个==二维集合(java常用集合,少用数组)==,可以类比数组进行操作

按行遍历的关键是每一行的深度对应了它输出在二维数组中的深度,即深度可以与二维数组的下标对应,那我们可以在递归的访问每个节点的时候记录深度depth

因此可以用递归实现:

  • 终止条件: 遍历到了空节点,就不再继续,返回。
  • 返回值: 将加入的输出数组中的结果往上返回。
  • 本级任务: 处理按照上述思路处理非空节点,并进入该节点的子节点作为子问题。

步骤

  1. ,创建二维集合,判断头结点是否为空,为空直接返回
  2. 传入root,深度为1,进行层序遍历
  3. 新的节点判断不为null,则判断res在这一层是否已经添加过元素,==没有添加==,则创建一个新的集合记录第一个访问的值,并添加到二维集合中,如果已经添加过元素,则从二维集合中取出这一层的集合,并将当前节点值添加进这一层的集合
  4. 递归进行层序遍历,递归时左右深度加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;
    }
}

总结

  1. java中多用集合来进行操作,课类比c语言中的数组
  2. 每一行的深度对应二维数组中的深度,但是变量depth不发生根本性的改变,从而在不是第一次给这一层集合添加元素时,可以取出对应层数的集合
  3. ==关于空指针异常==,除了递归时传参的的节点的后继节点调用不需要判空,其他的传入的节点都需要判空,如果想在程序中调用当前节点的后继节点也需要对后继节点判空