剑指-23 二叉搜索树的后续遍历判断

class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        # 如果 遍历序列为空 返回False
        if not sequence or not len(sequence):
            return False
        # 开始 
        return self.verify(sequence, 0, len(sequence)-1)
    
    def verify(self, sequence, start, root):
        # 如果判断区间为一个或者为空  直接返回true
        if start >= root:
            return True
        
        # root元素在sequence中的分界点索引  二叉搜索树特点  左子树 <root
        for i in range(start, root):
            if sequence[i] > sequence[root]:
                break
        # 判断root的 右子树是否 >root  
        for j in range(i+1, root):  # 注意 原本range(i, root) 这里有个坑,如果在前面的遍历中并没有break掉,而是正常循环结束,那么第二个循环就会有错,例如 sequnce = 6,7。第一个循环结束i=0,第二个循环中正常情况下应该不进入,但是还是会进入并且返回false。所以在python环境下,和java不一样,这里直接写成i+1其实也是不严谨的,严谨一点的应该是,通过break掉的,j in range(i, root); 通过正常循环结束的,j in range(i+1, root)  

            if sequence[j] < sequence[root]:
                return False
        # 接着 左右子树分别判断  且得满足二叉搜索树的要求
        return self.verify(sequence, start, i-1) and self.verify(sequence, i,root-1)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值