剑指题目——4、重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
1、由前序遍历规则可知,前序序列的第一个是根节点,即 root=pre[0]。
2、在中序序列中找到pre[0]根节点的位置,由此位置可分左右子树,其前面序列是左子树,后面是右子树。
(中序序列中根节点前后的序列也分别是左右子树的中序序列,前序序列中,对应左右子树中序序列元素的序列即也分别为左右子树的前序序列。)
3、对左右子树进行递归使用以上方法继续分解。
由前序和中序序列重建二叉树 代码如下:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
	def reConstructBinaryTree(self, pre, tin):
		if len(pre)==0:
			return None
		elif len(pre)==1:
			return TreeNode(pre[0])
		else:
			mid=tin.index(pre[0])  
			root=TreeNode(pre[0]) #创建一个树节点对象
			root.left=self.reConstructBinaryTree(pre[1:mid+1],tin[:mid]) 
			root.right=self.reConstructBinaryTree(pre[mid+1:],tin[mid+1:])
		return root 

若由中序和后序序列重建二叉树,则与由前序和中序重建类似,思路:
1、由后序遍历规则可知,后序遍历的最后一个结点是根节点,即 last[len(last)-1]。
2、由根节点可在中序遍历中确定左右子树,其前为左子树的中序遍历,其后为右子树的中序遍历。
(由左右子树的中序遍历节点确定其后序遍历的节点)
3、对左右子树进行递归继续分解下去。
代码如下:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        
class Solution:
	def reConstructBinaryTree(self, tin, last):
		if len(last)==0:
			return None
		elif len(last)==1:
			return TreeNode(last[0])
		else:
			finNode=last[-1]
			root=TreeNode(finNode)
			mid=tin.index(finNode)
			root.left=self.reConstructBinaryTree(tin[:mid],last[:mid+1])
			root.right=self.reConstructBinaryTree(tin[mid+1:],last[mid+1:-1])
			return root
		

这里附上二叉树的递归遍历代码:python实现二叉树的递归遍历

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值