7、重建二叉树(Python)
题目描述:
- 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
- 假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。
- 例如:输入的前序遍历为{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)相关推荐
- 用前序和中序重建二叉树 python
程序实现了用二叉树的前序遍历序列和中序遍历序列重建二叉树,代码用python实现. 首先定义二叉树节点的类: 1 class TreeNode: 2 def __init__(self, x): 3 ...
- 剑指offer 重建二叉树 python
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 样例 输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4, ...
- python根据二叉树的前序遍历和中序遍结果历重建二叉树
python根据二叉树的前序遍历和中序遍结果历重建二叉树 前序遍历 对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子.以上图为例,递归的过程如下: (1):输出 1,接着左孩子: ( ...
- 剑指offer_第4题_重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果 请重建出该二叉树 假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 【剑指offter】重建二叉树
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...
- 剑指offer第7题 重建二叉树
前言 该系列文章为本人刷leetcode的记录,主要旨在分享刷题的思路及算法解析(尽可能的一题多解),另方便自己日后查阅回顾.代码的实现语言是python和go. 想进大厂免不了刷题,一起加油吧,小伙 ...
- 剑指offer:面试题07. 重建二叉树
题目: 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...
- 根据二叉树的前序遍历和中序遍历重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 《编程之美》读书笔记19: 3.9 重建二叉树
<编程之美>读书笔记19: 3.9 重建二叉树 对根节点a以及先序遍历次序P和中序遍历次序I,查找a在I中的位置,将I分为两部分,左边部分的元素都在a的左子树上,右边的元素都在a的右子树上 ...
- 剑指Offer系列 重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
最新文章
- 学习MongoDB (1) :配置安装
- 图的m着色问题pascal程序
- Colored Boots
- spring-security认证授权
- ASP.NET AJAX 宝典系列(2) 在Visual Studio 2005 Web Application 项目中使用AJAX
- android apk如何入门
- 本地方法(JNI)——调用 java 方法
- android 音频合成_【Android工具】用手机测量噪声的工具软件,噪声仪分贝计,量化噪声声音工具...
- C++ builder报错
- numpy where
- bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】
- UVA10033 Interpreter【模拟】
- Oracle之:查询锁表,删除锁表
- JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
- 西宁公交调度员招聘计算机题库,调度员考试题库.doc
- mappedBy的基本认识
- 黑马程序员-银行业务调度系统
- virtualbox中ubuntu虚拟机安装增强功能
- mac下打开.mpp后缀文件的工具OmniPlan
- Android微信九宫格图片展示控件
热门文章
- 当航运遇上区块链: 有人在砸钱,有人想上车
- ARM正式发布v9架构,确认可供应华为,不受美国出口管制约束
- linux 内核块设备驱动,linux之块设备驱动
- 【优化预测】基于matlab布谷鸟搜索算法优化SVM预测【含Matlab源码 1525期】
- 【运动学】基于matlab GUI倒立摆系统【含Matlab源码 1117期】
- python前端工资_前端的工资分布情况-你又拖后退了吗?
- 算法 博士_Strangecode博士-我如何学会不再担心并喜欢算法
- app 怎么实现后端对前端的通知功能_app测试流程
- 《深入理解Hadoop(原书第2版)》——3.4第一个Hadoop程序
- 3.Web中使用iReport 整合----------创建PDF格式的