题目描述:

  • 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
  • 假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。
  • 例如:输入的前序遍历为{1,2,4,7,3,5,6,8}和中序遍历{4,7,2,1,5,3,8,6},则重建二叉树并输出它的头节点。

题目分析:

一些简要的思路:
二叉树中:

  • 前序遍历的根节点是第一个数字。输出顺序:节点、子树、子树
  • 中序遍历的根节点在中间位置。输出顺序:子树、节点、子树
  • 后序遍历的根节点是最后一个数字。输出顺序:节点、子树、子树

详细思路:

  • 前序遍历的第一个数字 1 就是根节点的值。
  • 中序遍历中,根节点的位置在序列的中间,左子树的结点在根节点的左边,右子树的结点的值在根节点的右边。故数字 1 前面的三个数字都是左子树节点的值,数字 1 后面的数字都是右子树节点的值。
  • 同样在前序遍历中,根节点后面的3个数字就是3个左子树节点的值,再后面的所有数字就是右子树的结点值。
  • 这时,我们在前序和后序遍历中都找到了左右子树的对应的子序列。
  • 再用递归的方法继续下去就好了!!

代码实现:

class TreeNode:       # 先声明一个二叉树def __init__(self,x):self.val = xself.left = Noneself.right = None
class Solution:       # pre是前序遍历,tin是中序遍历def reConstructBinaryTree(self,pre,tin):if not pre and not tin:    # 排空return Noneroot = TreeNode(pre[0])    # 根节点if set(pre) != set(tin):return Nonei = tin.index(pre[0])    # 根节点在中序遍历中的index# 一直递归下去root.left = self.reConstructBinaryTree(pre[1:i+1],tin[:i])    # 左子树一直递归下去root.right = self.reConstructBinaryTree(pre[i+1:],tin[i+1:])  # 右子树一直递归下去return rootdef Print_res(root,lists):     # 打印出后序遍历的数组列表if root ==  None:return listsPrint_res(root .left,lists)Print_res(root .right,lists)lists.append(root .val)return lists

验证

#// 普通二叉树
#//              1
#//           /     \
#//          2       3
#//         /       / \
#//        4       5   6
#//         \         /
#//          7       8
---------------------------------------------------
输入:
solution = Solution()lists=[]pre = [1,2,4,7,3,5,6,8]tin = [4,7,2,1,5,3,8,6]root = solution.reConstructBinaryTree(pre, tin)print(Print_res(root,lists))
输出:    [7, 4, 2, 5, 8, 6, 3, 1]
#// 所有结点都没有右子结点
#//            1
#//           /
#//          2
#//         /
#//        3
#//       /
#//      4
#//     /
#//    5
---------------------------------------------------
输入:
lists=[]
pre = [1, 2, 3, 4, 5]
tin = [5, 4, 3, 2, 1]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:    [5, 4, 3, 2, 1]
#// 所有结点都没有左子结点
#//            1
#//             \
#//              2
#//               \
#//                3
#//                 \
#//                  4
#//                   \
#//                    5
---------------------------------------------------
输入:
lists=[]
pre = [1, 2, 3, 4, 5]
tin = [1, 2, 3, 4, 5]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:   [5, 4, 3, 2, 1]
#// 树中只有一个结点
---------------------------------------------------
输入:
lists=[]
pre = [1]
tin = [1]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:  [1]
#// 完全二叉树
#//              1
#//           /     \
#//          2       3
#//         / \     / \
#//        4   5   6   7
---------------------------------------------------
输入:
lists=[]
pre = [1, 2, 4, 5, 3, 6, 7]
tin = [4, 2, 5, 1, 6, 3, 7]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:    [4, 5, 2, 6, 7, 3, 1]
#// 输入空指针
---------------------------------------------------
输入:
lists=[]
pre = None
tin = None
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:  []
#// 输入的两个序列不匹配
---------------------------------------------------
输入:
lists=[]
pre = [1, 2, 4, 5, 3, 6, 7]
tin = [4, 2, 8, 1, 6, 3, 7]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:  []

7、重建二叉树(Python)相关推荐

  1. 用前序和中序重建二叉树 python

    程序实现了用二叉树的前序遍历序列和中序遍历序列重建二叉树,代码用python实现. 首先定义二叉树节点的类: 1 class TreeNode: 2 def __init__(self, x): 3 ...

  2. 剑指offer 重建二叉树 python

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 样例 输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4, ...

  3. python根据二叉树的前序遍历和中序遍结果历重建二叉树

    python根据二叉树的前序遍历和中序遍结果历重建二叉树 前序遍历 对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子.以上图为例,递归的过程如下: (1):输出 1,接着左孩子: ( ...

  4. 剑指offer_第4题_重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果 请重建出该二叉树 假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  5. 【剑指offter】重建二叉树

    题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...

  6. 剑指offer第7题 重建二叉树

    前言 该系列文章为本人刷leetcode的记录,主要旨在分享刷题的思路及算法解析(尽可能的一题多解),另方便自己日后查阅回顾.代码的实现语言是python和go. 想进大厂免不了刷题,一起加油吧,小伙 ...

  7. 剑指offer:面试题07. 重建二叉树

    题目: 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...

  8. 根据二叉树的前序遍历和中序遍历重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  9. 《编程之美》读书笔记19: 3.9 重建二叉树

    <编程之美>读书笔记19: 3.9 重建二叉树 对根节点a以及先序遍历次序P和中序遍历次序I,查找a在I中的位置,将I分为两部分,左边部分的元素都在a的左子树上,右边的元素都在a的右子树上 ...

  10. 剑指Offer系列 重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

最新文章

  1. 学习MongoDB (1) :配置安装
  2. 图的m着色问题pascal程序
  3. Colored Boots
  4. spring-security认证授权
  5. ASP.NET AJAX 宝典系列(2) 在Visual Studio 2005 Web Application 项目中使用AJAX
  6. android apk如何入门
  7. 本地方法(JNI)——调用 java 方法
  8. android 音频合成_【Android工具】用手机测量噪声的工具软件,噪声仪分贝计,量化噪声声音工具...
  9. C++ builder报错
  10. numpy where
  11. bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】
  12. UVA10033 Interpreter【模拟】
  13. Oracle之:查询锁表,删除锁表
  14. JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
  15. 西宁公交调度员招聘计算机题库,调度员考试题库.doc
  16. mappedBy的基本认识
  17. 黑马程序员-银行业务调度系统
  18. virtualbox中ubuntu虚拟机安装增强功能
  19. mac下打开.mpp后缀文件的工具OmniPlan
  20. Android微信九宫格图片展示控件

热门文章

  1. 当航运遇上区块链: 有人在砸钱,有人想上车
  2. ARM正式发布v9架构,确认可供应华为,不受美国出口管制约束
  3. linux 内核块设备驱动,linux之块设备驱动
  4. 【优化预测】基于matlab布谷鸟搜索算法优化SVM预测【含Matlab源码 1525期】
  5. 【运动学】基于matlab GUI倒立摆系统【含Matlab源码 1117期】
  6. python前端工资_前端的工资分布情况-你又拖后退了吗?
  7. 算法 博士_Strangecode博士-我如何学会不再担心并喜欢算法
  8. app 怎么实现后端对前端的通知功能_app测试流程
  9. 《深入理解Hadoop(原书第2版)》——3.4第一个Hadoop程序
  10. 3.Web中使用iReport 整合----------创建PDF格式的