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

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

样例

[1,2,3,4,5] 
true
[1,2,3,6,4,5]
false

想法一:
使用递归方法,每次取出最后一个元素,即为root,遍历所有节点,找出左子树和右子树,再分别使用该方法进行查找。

class Solution:
    def VerifySquenceOfBST(self, sequence):
        if sequence == []:
            return False
        if len(sequence) == 1 or len(sequence) == 2:
            return True
        else:
            root = sequence.pop(-1)
            sign = 0
            note = 0
            flag = 0
            for i in range(len(sequence)):
                if sign is 0 and sequence[i] > root:
                    note = i
                    sign = -1
                if sequence[i] > root:
                    sign = 1
                    flag += 1
                if (sign == 1) and (sequence[i] < root):
                    return False
            if sign is 0:
                note = i
            if flag == len(sequence):
                note = 1
            return self.VerifySquenceOfBST(sequence[:note]) and self.VerifySquenceOfBST(sequence[note:])

想法二:
讨论区看到了相似的解法,不通过判断左右子树,直接无脑递归序列,如果出现了不合法序列,即右子树中小于root,返回false,其他情况直接序列减一继续递归。

class Solution:
    def VerifySquenceOfBST(self, sequence):
        if sequence == []:
            return False
        if len(sequence) == 1 or len(sequence) == 2:
            return True
        else:
            root = sequence.pop(-1)
            sign = 0
            for i in range(len(sequence)):
                if sequence[i] > root:
                    sign = 1
                if (sign == 1) and (sequence[i] < root):
                    return False
            return self.VerifySquenceOfBST(sequence[:i]) and self.VerifySquenceOfBST(sequence[i:])

最后

刷过的LeetCode或剑指offer源码放在Github上了,希望喜欢或者觉得有用的朋友点个star或者follow。
有任何问题可以在下面评论或者通过私信或联系方式找我。
联系方式
QQ:791034063
Wechat:liuyuhang791034063
CSDN:https://blog.csdn.net/Sun_White_Boy
Github:https://github.com/liuyuhang791034063

posted @ 2018-10-09 11:01  GF66  阅读(575)  评论(0编辑  收藏  举报