剑指offer07 重建二叉树

剑指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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值