[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)

你可能感兴趣的:([leetcode刷题] 通过前序遍历和中序遍历的结果还原二叉树)