【剑指offer】二叉搜索树的后序遍历序列(python)

思路类似于“树的子结构”
1.二叉搜索树的性质
若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。
图片说明
2. 根据序列的最后一位确认出根节点,因为二叉树左子树都小于根节点,右子树都大于根节点,所以由根节点确定左子树最后一位,从而得到右子树开始的点,验证右子树是否都大于根节点,递归验证左右两子树。

class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        if not sequence:
            return False
        return self.Define(sequence, 0, len(sequence)-1)
    def Define(self,sequence,first,last):
        if first + 1 >= last:
            return True
        root = sequence[last]
        pre = first
        # 根据根节点的值确定左子树最后一个结点位置
        while sequence[pre] <= root and pre < last:
            pre += 1
        # 右子树
        for i in range(pre, last):
            if sequence[i] < root:
                return False
        return self.Define(sequence, first, pre - 1) and self.Define(sequence,pre, last- 1)