题目描述

  • 输入某二叉树的前序遍历和中序遍历的结果
  • 请重建出该二叉树
    假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = None

理解

  • 二叉树的遍历(参考:二叉树遍历,重建二叉树)

    • 前序遍历(NLR)
      遍历顺序为(根-左-右),每次读取的第一个值一定是根节点,这样我们可以在中序遍历的序列中找到当前的根节点的位置。
    • 中序遍历( LNR)
      遍历顺序为(左-根-右),当确定了一个根节点后,其左边序列就是这个根节点的左子树,右边序列就是其右子树。
    • 后序遍历( LRN)
      遍历顺序为(左-右-根)

  • Python实现二叉树遍历

解题思路

思路1

  • 前序遍历的第一个值一定为根节点,对应于中序遍历中间的一个点。在中序遍历序列中,这个点左侧的均为根的左子树,这个点右侧的均为根的右子树。
  • 利用递归,分别取前序遍历[1:i+1]和中序遍历的[:i]对应与左子树继续上一个过程,取前序遍历[i+1:]和中序遍历[i+1:]对应于右子树继续上一个过程,最终得以重建二叉树。
  • i是中序序列中pre(0)所在位置,也就是中序序列中根的位置
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = None
class Solution:def reConstructBinaryTree(self, pre, mid):if len(pre) == 0:return Noneif len(pre) == 1:return TreeNode(pre[0])else:res = TreeNode(pre[0])res.left = self.reConstructBinaryTree(pre[1: mid.index(pre[0]) + 1], mid[: mid.index(pre[0])])res.right = self.reConstructBinaryTree(pre[mid.index(pre[0]) + 1: ], mid[mid.index(pre[0]) + 1: ])return res

附其他人写的代码:

class Solution:def reConstructBinaryTree(self, pre, tin):if pre==[]:return Noneval = pre[0]idx = tin.index(val)ltin = tin[0:idx]rtin = tin[idx+1:]lpre = pre[1:1+len(ltin)]rpre = pre[1+len(ltin):]root = TreeNode(val)root.left = self.reConstructBinaryTree(lpre,ltin)root.right = self.reConstructBinaryTree(rpre,rtin)return root

剑指offer_第4题_重建二叉树相关推荐

  1. 剑指offer_第14题_链表中倒数第k个结点_Python

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 理解 链表详解 python数据结构之链表 解题思路 思路1 确定链表种结点个数lenth 倒数第k个结点就是第length-k+1个结点 需要考 ...

  2. 剑指offer_第11题_二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数. 其中负数用补码表示. 理解 整数怎么转换为二进制 >>> bin(25) '0b11001' >>> bin ...

  3. 剑指offer_第7题_斐波那契数列

    题目描述 现在要求输入一个整数n 输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 理解 斐波那契数列 因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子 ...

  4. 剑指offer_第20题_包含min函数的栈_Python

    题目描述 定义栈的数据结构 并在该类型中实现一个能够得到栈中所含最小元素的min函数.时间复杂度应为O(1) 理解 什么是栈 算法复杂度 解题思路 思路1 class Solution:def __i ...

  5. 剑指offer_第19题_顺时针打印矩阵_Python

    题目描述 输入一个矩阵 按照从外向里以顺时针的顺序依次打印出每一个数字 例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  6. 剑指offer_第18题_二叉树的镜像_Python

    题目描述 将给定的二叉树,变换为其镜像 解题思路 思路1 递归 class Solution:# 返回镜像树的根节点def Mirror(self, root):if root:root.left,r ...

  7. 剑指offer_第17题_树的子结构_Python

    题目描述 输入两棵二叉树A,B 判断B是不是A的子结构. 其中空树不是任意一个树的子结构 class TreeNode:def __init__(self, x):self.val = xself.l ...

  8. 剑指offer_第16题_合并两个排序的链表_Python

    题目描述 输入两个单调递增的链表 输出两个链表合成后的链表 合成后的链表满足单调不减规则 解题思路 思路1 递归 def Merge(self, pHead1, pHead2):merge = Non ...

  9. 剑指offer_第15题_反转链表_Python

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 理解 怎么反转? 我要找到每个结点 改变每个结点的next 参考阅读: 链表翻转的图文讲解(递归与迭代两种实现) 翻转链表的三种方法 解题思路 ...

最新文章

  1. linux 磁盘查看方式
  2. IntelliJ IDEA竟然出了可以在云端编码的功能?
  3. 多个ai文件合并成pdf_如何将多个文档合并成PDF?
  4. gim-实时通讯框架
  5. IPv6邻居状态与邻居检测机制
  6. mysql 存储过程 获取错误信息 继续执行
  7. 国产web端开源ui组件-后台前端ui界面组件库
  8. 乐优商城(14)–订单服务
  9. 斐讯k2路由器v22.4.6.3版本刷breed刷华硕固件方法
  10. 明解C语言第四章习题
  11. 计算机化学试题,08计算机化学试卷yuanj.doc
  12. 蓝星实物微商城H5源码 附搭建教程
  13. vue的nxut框架生命周期触发两遍的问题
  14. 使用POI导出Excel时,关于设置带有多行表头表格自动宽度的问题解决办法
  15. 【开源编码分享】Python古三式∶太乙神数丶奇门遁甲丶大六壬
  16. 支付账户体系(分账接口)的9大价值
  17. Linux——挂载硬盘
  18. 一文彻底讲清Linux tty子系统架构及编程实例
  19. 【HISI系列】之HISI芯片自带硬件算法模块
  20. python计算机视觉 第四章照相机模型与增强现实

热门文章

  1. C#时间格式化(Datetime)用法详解
  2. 【青少年编程竞赛交流】10月份微信图文索引
  3. LeetCode实战:数组中的第K个最大元素
  4. 什么是自组织特征映射网络?
  5. scala while循环中断
  6. 我输给了一个 25 岁的男人
  7. 特斯拉AI团队招兵买马:“英雄不问出处”
  8. GPT2文本生成有问题?这里有些潜在解决思路
  9. 一文综述经典的深度文本分类方法
  10. 前端、云与人工智能的碰撞 | GDG广州