剑指offer07 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
思路:分治
前序遍历:[root,[左子树前序遍历结果],[右子树前序遍历结果]]
中序遍历:[[左子树中序遍历结果],root,[右子树中序遍历结果]]
递归过程:root+左子树重建+右子树重建
因此重点是确定每次子树重建时的范围,根据中序遍历对应索引确定前序遍历中对应子树的坐标范围
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
#迭代函数的输入为每次需要重建子树的前序遍历的左右边界索引、中序遍历左右边界索引
def helper(preorder_left,preorder_right,inorder_left,inorder_right):
#递归停止条件:左边界索引越过右边界
if preorder_left>preorder_right:return None
#首先创建根节点,即为前序遍历list中的第一个元素
root=TreeNode(preorder[preorder_left])
#通过哈希白表确定root在中序遍历list中对应的索引
i=hash[preorder[preorder_left]]
#重建左子树
#前序遍历左边界:前序遍历list中的第二个元素
#前序遍历右边界:前序list第一个元素索引+前序list长度(中序list中root的索引-中序list左边界)
#中序左边界:中序list第一个元素
#中序右边界:中序list root前一个元素
root.left=helper(preorder_left+1,preorder_left+i-inorder_left,inorder_left,i)
#重建右子树
root.right=helper(preorder_left+1+i-inorder_left,preorder_right,i+1,inorder_right)
return root
#创建hash表储存索引
hash={val:index for index,val in enumerate(inorder)}
l=len(preorder)
return helper(0,l-1,0,l-1)