0106-105-从中序与后序遍历序列中构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal
python
# 0106.中序后序构造二叉树 class Solution: def buildTree(self, inorder: [int], postorder: [int]) -> TreeNode: # 1.递归终止条件 if not postorder: return None # 2.后序最后元素为当前中间节点 rootVal = postorder[-1] root = TreeNode(rootVal) # 3.找切割点 sepIndex = inorder.index(rootVal) # 4.切割inorder数组,得到inorder的左右半边 inorderLeft = inorder[:sepIndex] inorderRight = inorder[sepIndex+1:] # 5.切割postorder数组,得到postorder数组的左右半边 postorderLeft = postorder[:len(inorderLeft)] postorderRight = postorder[len(inorderLeft):len(postorder)-1] # 6.递归左右半边 root.left = self.buildTree(inorderLeft, postorderLeft) root.right = self.buildTree(inorderRight, postorderRight) return root # 0105.前序中序构造二叉树 class Solution: def buildTree(self, preorder: [int], inorder: [int]) -> TreeNode: # 1.递归终止条件 if not preorder: return None # 2.前序第一个为当前中间节点 rootVal = preorder[0] root = TreeNode(rootVal) # 3.找切割点 sepIndex = inorder.index(rootVal) # 4.切割inorder数组,得左右半边 inorderLeft = inorder[:sepIndex] inorderRight = inorder[sepIndex+1:] # 5.切割preorder数组,得左右半边 pretorderLeft = preorder[1:1+len(inorderLeft)] pretorderRight = preorder[1+len(inorderLeft):] # 6.递归 root.left = self.buildTree(pretorderLeft, inorderLeft) root.right = self.buildTree(pretorderRight, inorderRight) return root
golang
package binaryTree // 0106.中后序构造二叉树 func buildTree1(inorder []int, postorder []int) *TreeNode { // 1.递归终止条件 if len(inorder) < 1 || len(postorder) < 1 { return nil } // 2.找到当前中间节点 nodeVal := postorder[len(postorder)-1] // 3.找到切割点 left := findRootIndex(inorder, nodeVal) // 4.构造root root := &TreeNode{Val: nodeVal, Left: buildTree1(inorder[:left], postorder[:left]), Right: buildTree1(inorder[left+1:], postorder[left:len(postorder)-1])} return root } func findRootIndex(inorder []int, targetVal int) int { for i,v := range inorder { if targetVal == v { return i } } return -1 } // 105.前中序构造二叉树 func buildTree2(preorder []int, inorder []int) *TreeNode { // 1.递归终止条件 if len(preorder) < 1 || len(inorder) < 1 { return nil } // 2.找当前中间点值 nodeVal := preorder[0] // 3.找切割位置 left := findRootIndex(inorder, nodeVal) // 4.构造root root := &TreeNode{ Val: nodeVal, Left: buildTree2(preorder[1:left+1], inorder[:left]), Right: buildTree2(preorder[left+1:], inorder[left+1:]) } return root }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)