https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
这里要注意postorder 最后一个值就是root。
思路参考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.
为了节约内存,我们不要每次都复制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