题解 | #二叉搜索树的后序遍历序列 python#

二叉搜索树的后序遍历序列

http://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd

  • 对于后续遍历序列,序列的最后一个值一定是树的根结点,而由二叉搜索树的性质:左小右大,我们可以从头开始遍历,当遍历到某个值比根结点大时停止,记为flag,此时flag之前的所有数值都是二叉搜索树的左子树的结点,flag以及flag之后的所有数都是二叉搜索树的右子树的结点。
    这是由二叉搜索树以及后序遍历共同决定的。
    接下来,我们就可以把任务交给递归,同样的方法去判断左子树和右子树是否是二叉搜索树,
# -*- coding:utf-8 -*-
class Solution:
    def VerifySquenceOfBST(self, sequence):
        if not sequence:
            return False
        if len(sequence) <= 2:
            return True
        for i in range(len(sequence)):
            if sequence[i] > sequence[-1]:
                break
            if i == len(sequence) - 1:
                return True
        for j in range(i, len(sequence)):
            if sequence[j] < sequence[-1]:
                return False
        left = True
        if i > 1:
            left = self.VerifySquenceOfBST(sequence[:i]) 
#注意这里切到i就可,因为前面的数都比i这个数小,没必要取,如果取可能会让前面是错误的数字判断为TRUE
        right = True
        if j < len(sequence):
            right = self.VerifySquenceOfBST(sequence[i:len(sequence)-1]) 
#注意这里初始值也切到i,不然可能会导致队列中没有数字,直接返回FALSE,
# 因为初始值切了fla***,如果末位置取到最后一个值也没意义,因为最初值永远比末位值大(之前已经判断过),可能导致后面判断出现错误,所以不取列表最后的值
        return left and right
        # write code here
全部评论
21行这里不太明白。 j在13行的循环中,可以达到的最大值不是len(sequence)-1吗,所以 j一定小于len(sequence),这个判断就失去了效果吧
点赞 回复
分享
发布于 2022-03-02 17:50

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务