剑指Offer:二叉搜索树的后序遍历序列(Python语言实现)

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

处理一棵二叉树的遍历序列,则可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,接下来再递归地处理这两个子序列。

class Solution:
    def verify_sequence_of_bst(self, sequence):
        if not sequence:
            return False

        return self.find_value(sequence)

    def find_middle_index_by_last(self, sequence):
        if not sequence:
            return True

        current = sequence[-1]
        flag, index = True, 0
        for si, su in enumerate(sequence):
            if flag:
                index = si
                if su > current:
                    flag = False
            elif su < current:
                break
        return si == len(sequence)-1 \
               and self.find_middle_index_by_last(sequence[:index]) \
               and self.find_middle_index_by_last(sequence[index:-1])


st = Solution()
nums = [4, 7, 5, 6, 10, 11, 8]
print(st.verify_sequence_of_bst(nums))
相关题目

输入一个整数数组,判断该数组是不是某二叉搜索树的前序遍历结果。
class Solution:
    def verify_sequence_of_bst(self, sequence):
        if not sequence or len(sequence) == 1:
            return False

        return self.find_value(sequence)

    def find_middle_index_by_first(self, sequence):
        if not sequence or len(sequence) == 1:
            return True

        current = sequence[0]
        flag, index = True, 0
        for si, su in enumerate(sequence):
            if flag:
                index = si
                if su > current:
                    flag = False
            elif su < current:
                if si == len(sequence) - 1:
                    si -= 1
                break
        return si == len(sequence)-1 \
               and self.find_middle_index_by_first(sequence[1:index]) \
               and self.find_middle_index_by_first(sequence[index:])

(最近更新:2019年07月24日)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值