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

PS:这道题不是leetcode原题,但是我们可以借鉴某些题目的思路根据前序遍历和中序遍历获取后序遍历_第1张图片

 方法一是根据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

方法二:

根据上面原题解法的思路,遍历的顺序其实是不断地切分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

这里有一组数据供尝试

#preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
#return postorder= [9, 15, 7, 20, 3]

你可能感兴趣的:(面试,算法学习,leetcode,算法)