leetcode第105题从前序与中序遍历序列构造二叉树--还原二叉树(递归)

该博客介绍了如何通过哈希映射优化前序和中序遍历构建二叉树的算法。在原始算法中,由于频繁使用index()导致超时,作者提出将节点索引入哈希表,从而避免了重复查找。算法通过递归地构建左子树和右子树来构造整个二叉树,并确保正确性。
摘要由CSDN通过智能技术生成

 因为用了很多index()运行超时了,然后因为前序和中序遍历里边没有重复元素,所以建一个hash把结点的索引放进去代替index()就行了。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def buildTree(self, preorder, inorder):
        """
        :type preorder: List[int]
        :type inorder: List[int]
        :rtype: TreeNode
        preorder放在0,inorder放在1
        """
        dict_p_i={}
        for index_p,p in enumerate(preorder):
            dict_p_i[p]=[index_p]
        for index_i,i in enumerate(inorder):
            dict_p_i[i].append(index_i)
        sign=[False for i in inorder]
        def Con_BT(root):
            index_root=dict_p_i[root.val][1]
            if index_root-1>=0 and not sign[index_root-1]:#有左子树
                left_temp=index_root-1#左子树在中序里的索引
                left_temp_last=dict_p_i[inorder[left_temp]][0]#左子树对应的数值在前序里的索引
                while left_temp>=0 and not sign[left_temp]:
                    temp_a=dict_p_i[inorder[left_temp]][0]
                    if temp_a<left_temp_last:
                        left_temp_last=temp_a
                    left_temp-=1
            if index_root+1<=len(inorder)-1 and not sign[index_root+1]:
                right_temp=index_root+1
                right_temp_last=dict_p_i[inorder[right_temp]][0]
                while right_temp<=len(inorder)-1 and not sign[right_temp]:
                    temp_b=dict_p_i[inorder[right_temp]][0]
                    if temp_b<right_temp_last:
                        right_temp_last=temp_b
                    right_temp+=1
            if index_root-1>=0 and not sign[index_root-1]:
                sign[dict_p_i[preorder[left_temp_last]][1]]=True
                root.left=TreeNode(preorder[left_temp_last])
                Con_BT(root.left)
            if index_root+1<=len(inorder)-1 and not sign[index_root+1]:
                sign[dict_p_i[preorder[right_temp_last]][1]]=True
                root.right=TreeNode(preorder[right_temp_last])
                Con_BT(root.right)
        a=TreeNode(preorder[0])
        sign[dict_p_i[preorder[0]][1]]=True
        Con_BT(a)
        return a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值