一. 题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
1. 思路
思路(1):递归
根据前序序列和中序序列,我们可以知道,前序序列的第一个数字1就是根节点的值。扫描中序序列,就能确定根节点的值的位置。根据中序遍历的特点,在根节点的值1前面的3个数字都是左子树节点的值,在1后面的数字都是右子树节点的值。而相应的,在前序遍历中,根节点后面的3个数字就是3个左子树节点的值,再后面的数字全部都是右子树节点的值。这样我们其实就找到了第一个根节点以及所对应的左子树序列和右子树序列。带进去我们得函数进行递归即可。因为左子树,右子树本质上也还是一棵树。
2. 代码
class treeNode:
def __init__(self,x):
self.val = x
self.left = None
self.right = None
class Solution:
def rebuild_tree(self,pre,center):
if not pre or not center:
return None
root = treeNode(pre[0])
"""
tag 就是为了得到在中序序列中根节点的位置,因为pre[0]肯定是根节点的值(前序序列第一个就是根节点),这样能够知道
中序序列中tag序列位置左边的几个序列应该是左子树上的,后面的都是右子树上的。假如tag是4,相应的,在前序序列中根节点后tag-1个序列是属于
左子树的,后面的全都是属于右子树的。
"""
tag = center.index(pre[0])
#递归
root.left = self.rebuild_tree(pre[1:tag+1],center[:tag])
root.right = self.rebuild_tree(pre[tag+1:],center[tag+1:])
return root