LeetCode 106. 从中序与后序遍历序列构造二叉树
1.LeetCode 203. 移除链表元素2.LeetCode 206. 反转链表3.LeetCode 24. 两两交换链表中的节点4.LeetCode 19. 删除链表的倒数第 N 个结点5.LeetCode 160. 相交链表6.LeetCode 142. 环形链表 II7.LeetCode 242. 有效的字母异位词8.LeetCode 349. 两个数组的交集9.LeetCode 202. 快乐数10.LeetCode 704. 二分查找 题解11.LeetCode 27. 移除元素 题解12.LeetCode 977. 有序数组的平方13.LeetCode 209. 长度最小的子数组14.LeetCode 59. 螺旋矩阵 II15.LeetCode 1. 两数之和16.LeetCode 454. 四数相加 II17.LeetCode 383. 赎金信18.LeetCode 15. 三数之和19.LeetCode 18. 四数之和20.LeetCode 76. 最小覆盖子串21.LeetCode 344. 反转字符串22.LeetCode 541. 反转字符串 II23.LeetCode 剑指 Offer 05. 替换空格24.LeetCode 151. 反转字符串中的单词25.LeetCode 剑指 Offer 58 - II. 左旋转字符串26.LeetCode 459. 重复的子字符串27.kmp算法详解28.LeetCode 20. 有效的括号29.LeetCode 1047. 删除字符串中的所有相邻重复项30.LeetCode 150. 逆波兰表达式求值31.LeetCode 239. 滑动窗口最大值32.LeetCode 347. 前 K 个高频元素33.LeetCode 94. 二叉树的中序遍历34.LeetCode 144. 二叉树的前序遍历35.LeetCode 145. 二叉树的后序遍历36.LeetCode 102. 二叉树的层序遍历37.LeetCode 226. 翻转二叉树38.LeetCode 101. 对称二叉树39.LeetCode 104. 二叉树的最大深度40.LeetCode 559. N 叉树的最大深度41.LeetCode 111. 二叉树的最小深度42.LeetCode 222. 完全二叉树的节点个数43.LeetCode 110. 平衡二叉树44.LeetCode 257. 二叉树的所有路径45.LeetCode 404. 左叶子之和46.LeetCode 513. 找树左下角的值47.LeetCode 112. 路径总和48.LeetCode 113. 路径总和 II
49.LeetCode 106. 从中序与后序遍历序列构造二叉树
50.LeetCode 105. 从前序与中序遍历序列构造二叉树51.LeetCode 654. 最大二叉树52.LeetCode 617. 合并二叉树53.LeetCode 700. 二叉搜索树中的搜索54.LeetCode 98. 验证二叉搜索树55.LeetCode 530. 二叉搜索树的最小绝对差56.LeetCode 501. 二叉搜索树中的众数57.LeetCode 236. 二叉树的最近公共祖先58.LeetCode 235. 二叉搜索树的最近公共祖先59.LeetCode 701. 二叉搜索树中的插入操作60.LeetCode 450. 删除二叉搜索树中的节点61.LeetCode 669. 修剪二叉搜索树62.LeetCode 108. 将有序数组转换为二叉搜索树63.LeetCode 538. 把二叉搜索树转换为累加树64.LeetCode 131. 分割回文串题目链接:LeetCode 106. 从中序与后序遍历序列构造二叉树
题意:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
解题思路:
模拟手动构建的过程,注意下标的变化
完整代码如下:
var (
hash map[int]int
)
func buildTree(inorder []int, postorder []int) *TreeNode {
hash = make(map[int]int)
for i, v := range inorder { // 用map保存中序序列的数值对应位置
hash[v] = i
}
// 以左闭右闭的原则进行切分
root := rebuild(inorder, postorder, len(postorder)-1, 0, len(inorder)-1)
return root
}
// rootIdx表示根节点在后序数组中的索引,l, r 表示在中序数组中的前后切分点
func rebuild(inorder []int, postorder []int, rootIdx int, l, r int) *TreeNode {
if l > r { // 说明没有元素,返回空树
return nil
}
if l == r { // 只剩唯一一个元素,直接返回
return &TreeNode{Val : inorder[l]}
}
rootV := postorder[rootIdx] // 根据后序数组找到根节点的值
rootIn := hash[rootV] // 找到根节点在对应的中序数组中的位置
root := &TreeNode{Val : rootV} // 构造根节点
// 重建左节点和右节点
root.Left = rebuild(inorder, postorder, rootIdx-(r-rootIn)-1, l, rootIn-1)
root.Right = rebuild(inorder, postorder, rootIdx-1, rootIn+1, r)
return root
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理