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

leetcode刷题日记——从前序与中序遍历序列构造二叉树

[ 题目描述 ]:
在这里插入图片描述
[ 思路 ]:

  • 递归构建,前序遍历是 [ 根节点,左孩子节点,右孩子节点 ],中序遍历是 [ 左孩子节点,根节点,右孩子节点]
  • 根据这一特性,可以知道,前序遍历中前面的节点是后面节点的,父亲或祖宗
  • 中序遍历中某个节点左边是他的左孩子们,右边是他的右孩子们
  • 由此我们对前序遍历的第一个节点开始构建,他一定是父节点,再将他在中序遍历中左边的节点和右边的节点划分出来,用于构建他的左右孩子
  • 以构建左孩子为例,求出左边孩子的个数n,由于前序遍历是 根左右 ,也就是说这些孩子一定在前序遍历的前 n+1个节点(第一个节点是父节点),将这 n 个前序遍历的节点和中序遍历的节点顺序列表进行新一轮递归
  • 运行如下
    在这里插入图片描述
# python代码
class Solution(object):def buildTree(self, preorder, inorder):""":type preorder: List[int]:type inorder: List[int]:rtype: Optional[TreeNode]"""if not preorder or not inorder:return Noneroot=TreeNode(preorder[0])val_index=inorder.index(preorder[0])left_inorder=inorder[0:val_index]right_inorder=inorder[val_index+1:]left_preoder=preorder[1:1+len(left_inorder)]right_preoder=preorder[1+len(left_inorder):]root.left=self.buildTree(left_preoder,left_inorder)root.right=self.buildTree(right_preoder,right_inorder)return root

[ 官方题解 ]:

  • 方法一:递归,基本同上
  • 方法二:迭代,依次枚举前序遍历中除了第一个节点以外的每个节点。如果 index 恰好指向栈顶节点,那么不断地弹出栈顶节点并向右移动 index,并将当前节点作为最后一个弹出的节点的右儿子;如果 index 和栈顶节点不同,则将当前节点作为栈顶节点的左儿子;
    • 无论是哪一种情况,最后都将当前的节点入栈。
class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:if not preorder:return Noneroot = TreeNode(preorder[0])stack = [root]inorderIndex = 0for i in range(1, len(preorder)):preorderVal = preorder[i]node = stack[-1]if node.val != inorder[inorderIndex]:node.left = TreeNode(preorderVal)stack.append(node.left)else:while stack and stack[-1].val == inorder[inorderIndex]:node = stack.pop()inorderIndex += 1node.right = TreeNode(preorderVal)stack.append(node.right)return root

相关文章:

  • SOC-ESP32S3部分:2-2-VSCode进行编译烧录
  • Visual Studio Code 改成中文模式(汉化)
  • 【机器学习】logistic回归
  • 【C++算法】70.队列+宽搜_N 叉树的层序遍历
  • C++使用max_element()配合distance()求出vector中的最大值及其位置
  • Nvidia - NVLink Fusion
  • 代码随想录算法训练营
  • Vue响应式系统演进与实现解析
  • 集成思想在算法(目标检测)中的体现
  • Python入门手册:Python简介,什么是Python
  • 操作系统----软考中级软件工程师(自用学习笔记)
  • 使用 GitHub Pages 部署单页面应用教程
  • vue路由小案例
  • Failed to resolve import “echarts“ from “src/views/HistoricalData.vue“.
  • 第 4 章:网络与总线——CAN / Ethernet / USB-OTG
  • 国产视频转换LT6211UX:HDMI2.0转LVDS/MIPI芯片简介,支持4K60Hz
  • File的使用
  • 聚焦开放智能,抢占技术高地 | 2025 高通边缘智能创新应用大赛第五场公开课来袭!
  • React表单开发的瑞士军刀:Formik与Yup实战指南
  • Android7 Input(八)App Input事件接收器InputEventReceiver
  • 演员辛柏青发讣告,妻子朱媛媛去世
  • 区域、学校、课堂联动,上海浦东让AI素养培育贯穿基础教育全学段
  • 换灯如换脸!西安碑林整修重开观展体验提升
  • 王毅会见美国亚洲协会会长康京和
  • 焦点访谈丨售假手段又翻新,警惕化肥“忽悠团”的坑农套路
  • 工程院院士、武汉纺织大学校长徐卫林拟任湖北省属本科高校党委书记