根据前序遍历和中序遍历获取后序遍历

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]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值