106. Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree.
题目:给定一个树的中序排列和后续排列数组,重新绘制出该树
思路:由于后序的顺序的最后一个肯定是根,所以原二叉树的根节点可以知道,题目中给了一个很关键的条件就是树中没有相同元素,有了这个条件我们就可以在中序遍历中也定位出根节点的位置,并以根节点的位置将中序遍历拆分为左右两个部分,分别对其递归调用原函数。
1 2 private int getIndexInInorder(int[] inorder, int val) { 3 for (int i = 0; i < inorder.length; i++) if (val == inorder[i]) return i; 4 return -1; 5 } 6 7 private TreeNode buildPostAndIn(int[] postorder, int[] inorder, int postIndex, 8 int startInIndex, int endInIndex) { 9 if (endInIndex < startInIndex) return null; 10 TreeNode node = new TreeNode(postorder[postIndex]);//后续,最后一个节点一定是根节点 11 int index = getIndexInInorder(inorder,node.val); //获取该节点在中序数组中的位置,进一步结合startInIndex和endInIndex可以获得左右字树的范围 12 int lenL = index - startInIndex; 13 int lenR = endInIndex - index; 14 if (lenL > 0) node.left = buildPostAndIn(postorder, inorder, postIndex - lenR - 1, startInIndex, 15 index - 1); 16 if (lenR > 0) node.right = buildPostAndIn(postorder, inorder, postIndex - 1, 17 index + 1, endInIndex); 18 return node; 19 } 20 21 public TreeNode buildTree(int[] inorder, int[] postorder) { 22 if (postorder == null || postorder.length == 0) return null; 23 if (inorder == null || inorder.length == 0) return null; 24 if (postorder.length != inorder.length) return null; 25 return buildPostAndIn(postorder, inorder, postorder.length-1, 0, inorder.length - 1); 26 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!