剑指offer:二叉搜索树的后序遍历序列

本文介绍了一种算法,用于验证一个整数序列是否可能为某一二叉搜索树的后序遍历结果。通过递归地查找根节点,并确定左子树和右子树的范围,确保所有左子节点小于根节点,所有右子节点大于根节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding:utf-8 -*-
class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        '''
        if sequence==[]:
            return False
        return self.judge(sequence,0,len(sequence)-1)
        
    def judge(self,seq,start,end):
        if start>=end:
            return True
        root=seq[end]
        i=end
        while i>start and seq[i-1]>seq[end]:
            i=i-1
        j=i-1
        while j>=start:
            if seq[j]>seq[end]:
                return False
            j=j-1
        return self.judge(seq,start,i-1) and self.judge(seq,i,end-1)
        '''
        if len(sequence)==0:
            return False
        return self.charge(sequence)
        
    def charge(self,sequence):
        length=len(sequence)
        if length==0:
            return True
        if length==1:
            return True
        root=sequence[-1]
        small=0
        while sequence[small]<root:
            small+=1
        for i in range(small,length-1):
            if sequence[i]<root:
                return False
        return self.charge(sequence[:small]) and self.charge(sequence[small:length-1])
        '''
        left=right=True
        if len(sequence[:small])>0:
            left=self.VerifySquenceOfBST(sequence[:small])
        if len(sequence[small:length-1]):
            right=self.VerifySquenceOfBST(sequence[small:length-1])
        return left and right
        '''

二叉搜索树是父节点的左孩子都比父节点小,右孩子都比父节点大。首先从根节点开始判断,根节点是s[-1],即最后一个元素。然后从数组开始遍历,找到不满足s[small]<root时,再从small开始遍历,如果不满足s[small]>root,返回false。注意递归的终点是遍历到叶子节点,或空节点,此时数组只有一个元素或没有元素。

还有一些细节:

while sequence[small]<root:
            small+=1

for i in range(small,length-1):
            if sequence[i]<root:
                return False

判断边界,s[small]<root不满足时,small+1已经执行,此时是在>root的一边,所以后面递归时的左子树是s[:small],刚好取到<root的所有。

第二个判断时length-1写成length也是可以的,因为判断到root时s[i]==root<root也不成立,不会触发return false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值