【详细整理】102 二叉树的层序遍历

一、题目

在这里插入图片描述

二、广度优先BFS

照着之前整理的BFS模板一下就写出来了。模板详细的分析整理见之前博客。

唯一的一个点是一边刷题一边学基础语法和数据结构。一开始有点懵怎么向二位的list里加元素。原来只有先新建一个list ,再向list里add就可以。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root==null){
            return res;
        }
        Queue<TreeNode> q =new LinkedList<>();
        q.offer(root);
        
        while(!q.isEmpty()){
            int size = q.size();
            List<Integer> A = new ArrayList<>();
            for(int i=0 ;i<size;i++){    
                root=q.poll();
                A.add(root.val);
                if(root.left != null){
                    q.add(root.left);
                }
                if(root.right != null){
                    q.add(root.right);
                }
                // else{return null;}
            }
            res.add(A);
        }
        return res;
    }
}

几个bug点分析

1、A要定义再函数外面,一开始定义再for里面,一个完整for循环放出来一层数据,所以定义在外面就可以。
在这里插入图片描述
2、一开始返回null,一看是写了一个return null。return之后就结束了。一开始加 null 是递归写习惯了边界条件
因为是往que里面加元素,所以不要return 和边界判断

三、递归

思路

思路:
先返回根节点
再返回其左右子树
再返回左右树的左右节点

代码

出现了递归点,但是怎么放到二维数组里呢,想想。但二维数组实在不熟,没想出来,看了评论区一个大佬递归思想后自己复现:

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        // List<List<Integer>> res = new ArrayList<>();
        int lever = 0;
        levelOrder(root,lever);
        return res;
    }
    public void levelOrder(TreeNode root,int lever){
        if (root==null){
            return ;
        }
        // ArrayList<Integer> list = new ArrayList<>(); 
        // 这个层第一次来,进行扩容存放该层的元素
        if(res.size()==lever){
            // list.add();
            res.add(new ArrayList<Integer>());
        }
        //递归中每一层的lever值是一样的,该层之后在来的时候直接存放就可以
        res.get(lever).add(root.val);
        // 递归一次lever+1;
        lever = lever+1;
        levelOrder(root.left,lever);
        levelOrder(root.right,lever);
    }
}

遇到的bug分析

一开始看了大佬思路后自己复现写出来是这个样的:


class Solution {
    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        // List<List<Integer>> res = new ArrayList<>();
        int lever = 0;
        levelOrder(root,lever);
        return res;

    }
    public void levelOrder(TreeNode root,int lever){
        if (root==null){
            return ;
        }
        ArrayList<Integer> list = new ArrayList<>(); 
        if(res.size()==lever){
            list.add(root.val);
        }
        
        res.add(list);
        lever = lever+1;
        levelOrder(root.left,lever);
        levelOrder(root.right,lever);
    }
}

在这里插入图片描述
开始想为什么,整理了一下:
在这里插入图片描述
就是上面那个原因,一样的层的时候lever一样,但我每一次都给它扩容了,所以自然后面添加不进去,所以又开始思索怎么只在层第一次出现给扩容。参考了一下评论
发现一个窍门:

if(res.size()==lever){
            // list.add();
            res.add(new ArrayList<Integer>());
        }
res.get(lever).add(root.val);

就很绝,解决!
二维list向某一个维度加元素:
list.get(lever).add(node.val);
可以用这个函数来把元素加到一个层,而不是每次增加res中list的数量
这样同一层的节点的lever和那个就会相等。

一开始还想着递归参数放左右子树,但后来发现这样不仅麻烦逻辑我还很难自恰,放弃

 public void levelOrder(TreeNode root_left,TreeNode root_right,int lever){
        if (root_left==null&&root_right==null){
            return ;
        }
        ArrayList<Integer> list = new ArrayList<>(); 
        if(res.size()==lever){
            list.add(root_left.val,root_right.val);
        }
        
        res.add(list);
        lever = lever+1;
        levelOrder(root_left.left,root_left.right,lever);
        levelOrder(root_right.left,root_right.right,lever);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值