PS:这道题不是leetcode原题,但是我们可以借鉴某些题目的思路
方法一是根据leetcode这道题的方法,构造出真正的二叉树结构,进而后序遍历即可,比较消耗空间,我们这里不表。
我把这道原题标准答案贴在这里,一会有用
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
def make_tree(i,lo,hi):
if lo>=hi:
return None
k=lo
while k<hi:
if inorder[k]==preorder[i]:
break
k+=1
node=TreeNode(preorder[i])
node.left=make_tree(i+1,lo,k)
node.right=make_tree(i+1+k-lo,k+1,hi)
return node
return make_tree(0,0,len(inorder))
方法二:
根据上面原题解法的思路,遍历的顺序其实是不断地切分inorder数组获得子数组范围(也就是lo--hi),最终递归地生成子树,我们需要借鉴的是找到根节点的思路,也就是用while循环遍历然后传入i+1和i+1+k-lo这两个过程,这确保了我们每次传入的都是下个递归的根。
再看遍历顺序,这是一个很典型的根--左--右顺序(根在传入的时候就确定了是下标i的preorder)。
那么我们换个思路,生成的顺序变成根-右-左,这个顺序倒过来就是左右根,也就是后序遍历的顺序。根据这个顺序,我们遍历到就将其保存到返回数组里就可以了。
def get_postorder(preorder:list,inorder:list)->list:
'''
:param preorder: 前序遍历
:param inorder: 中序遍历
:return: 二叉树的后序遍历
'''
ret=[]
def search(i:int,lo:int,hi:int):
if i>=len(preorder) or lo>=hi:
return
root=preorder[i]
k=lo
while k<hi and inorder[k]!=root:
k+=1
ret.append(root)
search(i+1+(k-lo),k+1,hi)#right tree
search(i+1,lo,k)#left tree
search(0,0,len(inorder))
return ret[::-1]
这里有一组数据供尝试
#preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] #return postorder= [9, 15, 7, 20, 3]