题目描述:
给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
提示:
1.vin.length == pre.length
2.pre 和 vin 均无重复元素
3.vin出现的元素均出现在 pre里
4.只需要返回根结点,系统会自动输出整颗树做答案对比
示例1
输入:[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
返回值:{1,2,3,4,#,5,6,#,7,#,#,8}
说明:返回根节点,系统会输出整颗二叉树对比结果,重建结果如题面图示
解题思路:
前序遍历的第一个结点的值为根节点的值,然后在中序遍历中寻找根节点的位置
从中序遍历的起始位置到根节点的位置为根节点(不包含)左子树的中序遍历序列,从中序遍历序列的根结点的值的位置(不包含)到结束位置为根结点右子树的中序遍历序列;相应的,从前序遍历序列的第二个元素开始的根结点左子树结点个数元素的子序列为根结点左子树的前序遍历序列,从下一个元素开始,直到结束位置的子序列为根结点右子树的前序遍历序列
python 代码实现:
class Solution:
def reConstructBinaryTree(self , pre: List[int], vin: List[int]) -> TreeNode:
# write code here
if len(pre)==0:
return None
elif len(pre)==1:
return TreeNode(pre[0])
else:
root=TreeNode(pre[0])
vinL=vin[:vin.index(pre[0])]
vinR=vin[vin.index(pre[0])+1:]
root.left=self.reConstructBinaryTree(pre[1:vin.index(pre[0])+1], vinL)
root.right=self.reConstructBinaryTree(pre[vin.index(pre[0])+1:], vinR)
return root