题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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实现二叉树的递归遍历