[leetcode刷题] 通过前序遍历和中序遍历的结果还原二叉树

题目传送门

通过前序遍历和中序遍历的结果还原二叉树

前序遍历是先输出val在进入left,left结束之后是right
而中序遍历是先进入left,left结束之后再输出val

因为这个特点:
1.对于所有的preorder[0]来说都是当前树的root。
2.在通过这个root的值在inorder里找到相应的idx,所有idx左边的都是left的输出结果,可求出 inorderL 和 inorderR
3.再因为preorder和inorder的长度永远相等,可以通过inorderL的长度在preorder中取到preorderL和preorderR
4.然后递归
5.函数开头要判断preorder长度是否为零返回none来做特殊处理

tips:有了特殊处理了所以递归时候也可以不考虑两个数组的长度直接调用,但是会比较慢才50%,这里也加none的特殊判断会快很多到80%,应该是因为所有的叶子结点也都要白白进一次函数

class Solution(object):

    def innerBT(self, preorder, inorder, idxmap, offset):
        #idx = inorder.index(preorder[0])
        idx = idxmap[preorder[0]]-offset
        l_inorder = inorder[:idx]
        r_inorder = inorder[idx+1:]
        l_preorder = preorder[1:idx+1]
        r_preorder = preorder[idx+1:]

        root = TreeNode(preorder[0])
        root.left = None if len(l_inorder) == 0 else self.innerBT(l_preorder, l_inorder, idxmap, offset)
        root.right = None if len(r_inorder) == 0 else self.innerBT(r_preorder, r_inorder, idxmap, offset+1+len(l_inorder))

        return root

    def buildTree(self, preorder, inorder):
        """
        :type preorder: List[int]
        :type inorder: List[int]
        :rtype: TreeNode
        """
        if len(preorder) <= 0 :
            return None
        idxmap = dict(zip(inorder ,range(len(inorder))))

        return self.innerBT(preorder, inorder, idxmap, 0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值