leetcode -- Construct Binary Tree from Inorder and Postorder Traversal

https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

这里要注意postorder 最后一个值就是root。

思路1

思路参考http://www.cnblogs.com/zuoyuan/p/3720138.html。

这里ref的思路是对的,并且这里在递归的时候

root.left = \
    self.buildTree(inorder[ 0 : index ], postorder[ 0 : index ])
root.right = \
    self.buildTree(inorder[ index + 1 : len(inorder) ], postorder[ index : len(postorder) - 1 ])

这里不用管是先递归左子树还是先递归右子树,因为postorder[ 0 : index ] 是复制了一份然后传给buildTree函数的。当树很大的时候,会造成内存不够MLE. 这份code提交的时候也确实是 MLE.

思路2

为了节约内存,我们不要每次都复制postorder,直接pop出root之后直接传到递归函数内,但是这里要注意,pop出root之后,postorder最后一个值对应的是右子树的root,所以要先递归右子树,等postorder关于右子树的node都pop完之后,再用剩下postorder来递归左子树。这样就节省很多内存。

例如。给定树{1,2,3,4,5,6,7}. 中序遍历为{4,2,5,1,6,3,7},后序遍历为{4,5,2,6,7,3,1}.pop掉postorder的1之后,就是{4,5,2,6,7,3}。

对应递归右子树,将postorder {4,5,2,6,7,3} 与 left subtree inorder {6,3,7}传入 递归函数. 返回时 postorder为{4,5,2}

再递归左子树,将postorder {4,5,2} 与 left subtree inorder {4,2,5}传入 递归函数. 返回时 postorder为{}。

然后结束。返回root.

code 参考http://blog.hushlight.com/2015/02/leetcode-construct-binary-tree-inorder-postorder-traversal/

class Solution:
    def buildTree(self, inorder, postorder):
        if len(inorder) == 0 :
            return None
        last = postorder.pop()
        node = TreeNode(last)
        i = inorder.index(last)
        node.right = self.buildTree(inorder[i+1:],postorder)
        node.left = self.buildTree(inorder[0:i],postorder)
        return node

你可能感兴趣的:(LeetCode)