已知二叉树的preorder, inorder得出postorder
leetcode-105
已知前序/后序任意一个和中序遍历,可得出另一种遍历。但如果不知道中序,无解:)下图形象地展示了不同遍历方式对应root节点和left,right子树在数组中位置。(假设遍历得到的结果以数组存储)
我们使用辅助方法:
build(self, preorder, preStart, preEnd, inorder, inStart, inEnd)来控制索引。
几个重要变量:
rootVal = preorder[0]/preorder(preStart)
index为在inorder中的位置
leftSize控制中序左右侧长度
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
return self.build(preorder, 0, len(preorder)-1, inorder, 0, len(inorder)-1)
def build(self, preorder, preStart, preEnd, inorder, inStart, inEnd):
if preStart > preEnd: #base case
return None
rootValue = preorder[preStart]
index = 0
for i in range(inStart,inEnd+1):
if inorder[i] == rootValue:
index = i
break
leftLen = index - inStart #left length
root = TreeNode(rootValue)
root.left = self.build(preorder,preStart+1, preStart+leftLen, inorder,inStart,index-1)
root.right = self.build(preorder,preStart+leftLen+1, preEnd, inorder, index+1, inEnd)
return root
已知二叉树的postorder, inorder得出preorder
思路几乎同上,注意postorder里最后一个位置是root, 以及注意root.right的postorder范围最右侧是postEnd-1,最后一位是root~