当前位置: 首页 > news >正文

每日一题~中序后序遍历构造二叉树

原题链接:106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

题目描述:

思路分析:

后序遍历分析图

中序遍历分析图

不难看出后序遍历的结果中的最后一个元素就是根节点,倒数第二个元素则是根节点的右子树的根节点,而倒数第三个元素是右子树的新右子树的根节点,依次类推。我们可以根据这一特性先构造二叉树的右子树。

接下来我们再分析一下中序遍历,如图所示,我们将二叉树和中序遍历结果拆开后发现,在中序遍历中根节点的左侧数据则恰好是二叉树的左子树,而根节点的右侧数据恰好是二叉树的右子树。根据中序遍历和后序遍历的规律,那么我们就可以将这个还原二叉树的过程分为两大步骤:

1. 在后序遍历中找根节点;2. 在中序遍历中找到根节点;3. 构建子树。接下来我们详细分析一下这个过程。

1. 寻找根节点,我们根据 postorder 数组从后往前开始找根节点,第一个节点即为 postorder[postorder.length-1]。第一个节点比较容易找到,但是其他的节点就没有那么容易,因此我们准备了一个 index 用来记录找到了多少个节点,这样在找后面的节点的时候我们只需要找postorder[postorder.length-1-index] 就可以了。

2. 在 inorder 数组中找到根节点 rootIndex 的位置,这一步骤非常重要,是接下来构建根节点的子树的前提,rootIndex 的左边是左子树,rootIndex 的右边是右子树。

3. 构建右子树,左子树。必须要先构建右子树,因为 postorder 从后往前的顺序就是右子树在先,左子树在后。

代码示例:

class Solution {public int index = 0;public TreeNode buildTree(int[] inorder, int[] postorder) {int len = postorder.length-1;return createChild(inorder,postorder,0,inorder.length-1,len);}public int findIndex(int[] inorder,int val,int beg, int end) {for(int i = beg; i <= end; i++) {if(inorder[i] == val) return i;}return -1;}public TreeNode createChild(int[] inorder,int[] postorder,int beg,int end,int len) {if(beg > end) return null;TreeNode root = new TreeNode(postorder[len-index]);// 在中序遍历数组中找到 root 的值的位置int rootIndex = findIndex(inorder,postorder[len-index],beg,end);index++;root.right = createChild(inorder,postorder,rootIndex+1,end,len);root.left = createChild(inorder,postorder,beg,rootIndex-1,len);return root;}
}
http://www.lryc.cn/news/167895.html

相关文章:

  • Sentinel整合Gateway
  • 线性dp,优化,272. 最长公共上升子序列
  • 基于Java+SpringBoot+Vue+uniapp点餐小程序(包含协同过滤算法和会员系统,强烈推荐!)
  • ActiveMQ面试题(二)
  • 解决Oracle SQL语句性能问题——SQL语句改写(in、not in、exists及not exists)
  • 列表对象复制属性到另一个列表对象 从List<Object>另一个List<Object>
  • Python基本情况
  • 【精华】AI Agent:大模型改变世界的“钥匙”
  • CVPR2023 RIFormer, 无需TokenMixer也能达成SOTA性能的极简ViT架构
  • 瑞萨MCU入门教程(非常详细的瑞萨单片机入门教程)
  • 【Java】采用 Tabula 技术对 PDF 文件内表格进行数据提取
  • 完全保密的以太坊交易:Aztec网络的隐私架构
  • 初识Java 9-1 内部类
  • 合宙Air724UG LuatOS-Air LVGL API控件-屏幕横屏竖屏切换(Rotation)
  • 在Unity中,Instantiate函数用于在场景中创建一个新的游戏对象实例
  • 解决 tesserocr报错 Failed to init API, possibly an invalid tessdata path : ./
  • 使用Python CV2融合人脸到新图片--优化版
  • Python分享之对象的属性
  • 编程参考 - std::exchange和std::swap的区别
  • Sentinel整合RestTemplate
  • 微前端学习(下)
  • Android Splash实现
  • FPGA projet : VGA
  • JDK8 升级至JDK19
  • Python3.10 IDLE更换主题
  • C# OpenVino Yolov8 Pose 姿态识别
  • 北邮22级信通院数电:Verilog-FPGA(1)实验一“跑通第一个例程” 过程中遇到的常见问题与解决方案汇总(持续更新中)
  • CSS - 鼠标移入整行高亮显示,适用于会员套餐各参数对比页面(display: table,div 转表格形式)
  • 无涯教程-JavaScript - ATAN2函数
  • Tomcat 下部署 jFinal