前序遍历为:
(根结点) (前序遍历左分支) (前序遍历右分支)
而后序遍历为:
(后序遍历左分支) (后序遍历右分支) (根结点)
我们令左分支有 L个节点。我们知道左分支的头节点为 pre[1],是前序遍历根节点后面的第一个位置
根据后序遍历的规则,它也出现在左分支的后序表示的最后。
所以 pre[1] = post[L-1](因为结点的值具有唯一性),因此 L = post.indexOf(pre[1]) + 1 左分支长度
现在在我们的递归步骤中,左分支由 pre[1 : L+1] 和 post[0 : L] 重新分支,而右分支将由 pre[L+1 : N] 和 post[L : N-1] 重新分支。
def constructFromPrePost(self, preorder, postorder):
"""
:type preorder: List[int]
:type postorder: List[int]
:rtype: TreeNode
"""
if postorder and preorder:
node = preorder[0]
root = TreeNode(node)
if len(preorder) == 1:
return root
L = postorder.index(preorder[1])+1
root.left = self.constructFromPrePost(preorder[1:L+1],postorder[:L])
root.right = self.constructFromPrePost(preorder[L+1:],postorder[L:-1])
return root