尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
106.从中序与后序遍历序列构造二叉树
题目编号: 106题目名称: 106.从中序与后序遍历序列构造二叉树难度: 中等题目信息链接从中序与后序遍历序列构造二叉树考察知识点二叉树、递归、迭代解题思路解法一递归使用哈希表存储inorder中对应元素的下标降低查找时间然后递归使用根节点索引建立右子树和左子树。代码如下classSolution{privateint[]postorder;privateMapInteger,IntegerinorderMapnewHashMap();privateintpostIdx;publicTreeNodebuildTree(int[]inorder,int[]postorder){this.postorderpostorder;this.postIdxpostorder.length-1;for(inti0;iinorder.length;i){inorderMap.put(inorder[i],i);}returnbuild(0,inorder.length-1);}privateTreeNodebuild(intinLeft,intinRight){if(inLeftinRight)returnnull;introotValpostorder[postIdx--];TreeNoderootnewTreeNode(rootVal);intinRootinorderMap.get(rootVal);root.rightbuild(inRoot1,inRight);root.leftbuild(inLeft,inRoot-1);returnroot;}}复杂度分析时间复杂度O ( n ) O(n)O(n)。空间复杂度O ( n ) O(n)O(n)。解法二简单来说每次从后序里拿一个新节点它要么是栈顶的右孩子要么是某个祖先包括自己的左孩子。光看后序根本分不清所以我们自然想到用中序来帮忙 ——中序里一个节点出现了就说明它的右子树已经全部走完了。有了这个判断依据事情就简单了如果栈顶在中序里还没出现说明它的右路还没走完新节点直接挂成它的右孩子。如果栈顶已经在中序里出现了说明它和它上面的父亲、爷爷可能都完工了。那就顺着栈往上弹像认亲一样逐个问“你的右子树走完了吗”直到碰见第一个回答“没走完”的祖先为止。这时候停下来新节点就挂在刚刚被弹出去的那个节点也就是这个祖先的右孩子的左边。代码如下classSolution{publicTreeNodebuildTree(int[]inorder,int[]postorder){if(postordernull||postorder.length0){returnnull;}DequeTreeNodestacknewArrayDeque();intindexinorder.length-1;introotValpostorder[postorder.length-1];TreeNoderootnewTreeNode(rootVal);stack.push(root);for(intipostorder.length-2;i0;i--){// 从后序遍历序列中把结点值拿出来intvalpostorder[i];// 判断当前栈顶是不是右子树构建完了TreeNodenodestack.peek();// 右子树还没构建完应该挂在栈顶if(node.val!inorder[index]){node.rightnewTreeNode(val);stack.push(node.right);}else{// 弹出栈顶的结点直到栈为空或者遇到第一个右子树没有构建完的结点while(!stack.isEmpty()stack.peek().valinorder[index]){//保存每次弹出的结点nodestack.pop();// 中序遍历递减index--;}//从循环出来意味着当前栈顶元素的右子树没有构建完//应该把这个新结点挂在上一轮弹出的结点左边node.leftnewTreeNode(val);//然后把这个结点压入stack.push(node.left);}}returnroot;}}复杂度分析时间复杂度O ( n ) O(n)O(n)。空间复杂度O ( n ) O(n)O(n)。
RELATED

相关推荐

Django 权限系统项目实战详细图文教程1--前后端架构搭建设计

Django 权限系统项目实战详细图文教程1--前后端架构搭建设计

来源引用网络知识与某站曹老师视频相互结合学习记录,仅供参考! 架构搭建 一、后端架构搭建 创建项目 1、PyCharm 工具→文件(F)→新建项目...→选中“Django”项目→自定义输入名称后单击“创建”按钮,推荐使用项目虚拟环境; 2…

📅 2026/10/21 2:25:45
容器虚拟化基础--NameSpace空间隔离详解

容器虚拟化基础--NameSpace空间隔离详解

目录 1. dd 命令详解 2. mkfs 命令详解 3. df 命令详解 4. mount 命令详解 5. unshare 命令详解 6. 实战操作一(PID隔离) 7. 实战操作二(Mount隔离) 望读者能通过此文了解隔离能力并不是 docker 提供的,而是操作…

📅 2026/10/21 2:25:45
Java多线程八股文:核心知识点与高频面试题解析

Java多线程八股文:核心知识点与高频面试题解析

1. 线程与进程的基本概念进程是操作系统进行资源分配和调度的基本单位,拥有独立的地址空间;线程是进程内的执行单元,共享进程的堆和方法区,但每个线程拥有独立的虚拟机栈和程序计数器。Java 中创建线程主要有三种方式:…

📅 2026/10/21 2:25:45
MORE NEWS

更多资讯

📰

VS Code高效开发指南:工作区、多光标与调试技巧

1. 第一次使用就该搞懂的工作区概念:文件夹与.code-workspace很多人上手VS Code,习惯就是点击"文件-打开文件夹",把一个项目目录拖进窗口就开始写代码。这个流程对单仓库项目完全没问题,直到你开始同时维护多个仓库、前…

📰

统信UOS服务器部署OpenClaw AI Agent完整避坑手册

刚在一台统信 UOS V2500 服务器上把 OpenClaw AI Agent 完整跑通,前后踩了大大小小七八个坑,这里把整个安装部署过程整理成一份可照着抄的手册。UOS 服务器版和常见的 x86 发行版不太一样,尤其涉及 Python 版本、动态库、编译工具链这几块&am…

📰

Kubernetes生产实战:HPA自动扩缩容与Helm编排实践

1. 先搞清楚这两个东西到底在解决什么问题1.1 扩容这件事,为什么不能靠手点我见过太多团队在 Kubernetes 上跑业务,第一年风平浪静,第二年一到流量高峰就全员进入“备战状态”。运维盯着 Grafana 看流量,流量一涨立刻 kubectl sca…

📰

HPA与Helm实战:Kubernetes自动扩缩容与模板化部署

如果你负责维护一个 Kubernetes 集群,或者正打算把业务往容器平台上迁移,那么 HPA 和 Helm 这两样东西早晚会一起出现在你的工作清单里。HPA 干的事情比较纯粹:让应用的副本数跟着流量自动变化,流量大了自动扩容,闲下来…

📰

单周期RISC-V CPU设计:Vivado实战与FPGA落地指南

简介:本资源是一套基于Verilog实现的单周期CPU完整FPGA设计工程,面向数字电路、计算机组成原理课程学习者及FPGA初学者,旨在通过可综合、可仿真的真实项目,直观呈现取指、译码、执行、写回等CPU核心流程,解决教学中抽象…

📰

用GDAL实现遥感影像裁剪:从范围裁剪到批量处理实战

搞遥感影像处理的人,迟早都会碰到影像裁剪这个需求。无论是从一幅标准景影像里切出研究区,还是按行政区边界做镶嵌裁剪,抑或是给深度学习模型准备训练切片,这一步几乎绕不开。GDAL 是我这些年用得最顺手的工具,没有之一…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬