Leetcode刷题记录——剑指 Offer 33. 二叉搜索树的后序遍历序列

在这里插入图片描述
后续 [左子树区,右子树区,根]
二叉搜索树 严格满足 左子树区<根<右子树区
因为不能保证数组是满足 左子树<根<右子树的
所以需要从头开始依次遍历

特殊情况:
只有一个root的后续 True

否则 需要划分左右子树区
先确定 根root为post[-1]
我们在[:-1]上 找第一个比根大的节点 此节点为右子树区开端
之后 继续遍历 如果在右子树区找到比root小的 则false
如果没有比root大的 再判断左子树和右子树是不是也是二叉搜索树

上述的寻找有下面几种可能
1、第一个就比根大 很好 左子树区变为空list 右子树区变为[:-1]
此时继续遍历 先看是否有比root小的 然后判断右子树区是不是二叉搜索树
2、没有比根大的 即右子树区为空
此时只需要判断左子树区 是不是二叉搜索树即可
3、找到比根大的第一个数 在中间
则继续寻找 如果右子树区不存在比根小的
则判断左右子树是不是二叉搜索树

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        #print(postorder)
        if len(postorder) <= 1:
            return True
        root = postorder[-1]
        rindex = None
        for i in range(len(postorder)-1):
            if postorder[i] < root:
                if rindex != None:
                    return False
                else:
                    continue
            elif postorder[i] >root:
                if rindex == None:
                    rindex = i
                else:
                    continue
        if rindex == None:
            return self.verifyPostorder(postorder[:-1])
        return True if self.verifyPostorder(postorder[:rindex]) and self.verifyPostorder(postorder[rindex:-1]) else False

猜你喜欢

转载自blog.csdn.net/weixin_41545780/article/details/107575877