二叉树按层遍历并收集结点

简介: 二叉树按层遍历并收集结点

二叉树按层遍历并收集结点

力扣链接:二叉树的按层遍历II

题目

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例

在这里插入图片描述

提示

树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000

题解

先不关心倒序的事,这个题目返回的肯定是一个嵌套的list,外层的list套着一个个小list

在这里插入图片描述

解题步骤
  1. 拿出此时队列的size,size有多少个,步骤2重复多少回;
  2. 弹出当前结点,当前结点有左孩子就先将左孩子加入队列,有右孩子再将右孩子加入队列;(先左再右
问题

经历上面的步骤,确实是按顺序收集好了,但是题目要求的是倒序收集,即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历

此时如果外层的list用的是ArrayList的话,因为它底层就是数组,所以插入数据代价是O(N)的;如果外层用的是LinkedList,它底层用的是链表,插入数据的代价就是O(1)的。

小测试(分别测试ArrayList和LinkedList插入数据的效率),每次都在0位置上插入数据,测试了300000组,单位时间为毫秒(刚兴趣的同学也可以自己测试下)

public class Code10_BinaryTreeLevelOrderTraversalII {
    public static void main(String[] args) {
        int testTimes=300000;
        long start;
        long end;
        ArrayList<Integer> arr1=new ArrayList<>();
        start=System.currentTimeMillis();
        for(int i=0; i<testTimes; i++){
            arr1.add(0,i);
        }
        end=System.currentTimeMillis();
        System.out.println(end-start);

        LinkedList<Integer> arr2=new LinkedList<>();
        start=System.currentTimeMillis();
        for(int i=0; i<testTimes; i++){
            arr2.add(0,i);
        }
        end=System.currentTimeMillis();
        System.out.println(end-start);
    }
}
AI 代码解读

测试结果
在这里插入图片描述

代码
public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ans=new LinkedList<>();
        if(root==null){
            return ans;
        }
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            int size=queue.size();// 必须要记录size,不能直接 i<queue.size()
            List<Integer> curAns=new LinkedList<>();
            for(int i=0; i<size; i++){
                TreeNode curNode=queue.poll();
                curAns.add(curNode.val);
                if(curNode.left!=null){
                    queue.add(curNode.left);
                }
                if(curNode.right!=null){
                    queue.add(curNode.right);
                }
            }
            ans.add(0,curAns);
        }
        return ans;
    }
AI 代码解读

扩展

Java中队列是个接口,不能够自己实现。栈可以自己实例化,但是Java中栈的方法实现起来是比较慢的(具体为什么慢就要去看源码了,可以说是个经验),所以如果想优化常数时间的话,应该自己去实现一个栈,而别去用Java系统中提供的栈,可以用LinkedList,也可以用数组(栈不就是先进后出嘛)。

最快的情况下就是用数组实现栈(一些笔试情况下,需要优化常数时间的时候,经常用到),假设数组长度为一万,那么我们也可以确定栈的大小就是一万...

我们也可以来做个小测试

        int testTimes2=20000000;
        start=System.currentTimeMillis();
        Stack<Integer> stack1=new Stack<>();
        for(int i=0; i<testTimes2; i++){
            stack1.push(i);
        }
        while(!stack1.isEmpty()){
            int a=stack1.pop();
        }
        end=System.currentTimeMillis();
        System.out.println(end-start);


        start=System.currentTimeMillis();
        int[] stack2=new int[testTimes2];
        int i=0;
        for( ; i<testTimes2; i++){
            stack2[i++]=i;
        }
        while(i!=0){
            int b=stack2[--i];
        }
        end=System.currentTimeMillis();
        System.out.println(end-start);
AI 代码解读

测试结果:插入弹出20000000次,系统栈耗费时间6000多毫秒,自己用数组实现的栈只耗费了79毫秒,极大的优化了常数时间!
在这里插入图片描述

目录
打赏
0
0
0
0
3
分享
相关文章
kde
|
3天前
|
Docker镜像加速指南:手把手教你配置国内镜像源
配置国内镜像源可大幅提升 Docker 拉取速度,解决访问 Docker Hub 缓慢问题。本文详解 Linux、Docker Desktop 配置方法,并提供测速对比与常见问题解答,附最新可用镜像源列表,助力高效开发部署。
kde
1547 4
2025年最新版最细致Maven安装与配置指南(任何版本都可以依据本文章配置)
本文详细介绍了Maven的项目管理工具特性、安装步骤和配置方法。主要内容包括: Maven概述:解释Maven作为基于POM的构建工具,具备依赖管理、构建生命周期和仓库管理等功能。 安装步骤: 从官网下载最新版本 解压到指定目录 创建本地仓库文件夹 关键配置: 修改settings.xml文件 配置阿里云和清华大学镜像仓库以加速依赖下载 设置本地仓库路径 附加说明:包含详细的配置示例和截图指导,适用于各种操作系统环境。 本文提供了完整的Maven安装和配置
2025年最新版最细致Maven安装与配置指南(任何版本都可以依据本文章配置)
Dify MCP 保姆级教程来了!
大语言模型,例如 DeepSeek,如果不能联网、不能操作外部工具,只能是聊天机器人。除了聊天没什么可做的。
446 5
Excel数据治理新思路:引入智能体实现自动纠错【Python+Agent】
本文介绍如何利用智能体与Python代码批量处理Excel中的脏数据,解决人工录入导致的格式混乱、逻辑错误等问题。通过构建具备数据校验、异常标记及自动修正功能的系统,将数小时的人工核查任务缩短至分钟级,大幅提升数据一致性和办公效率。
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
143 63
让AI时代的卓越架构触手可及,阿里云技术解决方案开放免费试用
阿里云推出基于场景的解决方案免费试用活动,新老用户均可领取100点试用点,完成部署还可再领最高100点,相当于一年可获得最高200元云资源。覆盖AI、大数据、互联网应用开发等多个领域,支持热门场景如DeepSeek部署、模型微调等,助力企业和开发者快速验证方案并上云。
215 16
让AI时代的卓越架构触手可及,阿里云技术解决方案开放免费试用
国内如何安装和使用 Claude Code镜像教程 - Windows 用户篇
国内如何安装和使用 Claude Code镜像教程 - Windows 用户篇
275 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问