AcWing 46.二叉搜索树的后序遍历(Python版)

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。

如果是则返回true,否则返回false。

假设输入的数组的任意两个数字都互不相同。
样例:
输入:[4,8,6,12,16,14,10]
输出:True

思路

关于二叉搜索树及后序遍历的一些性质:
1、在搜索二叉树中,小于父节点的键都在左子树中,大于父节点的键都在右子树中(二叉搜索性)。也即是说,对于任意一棵二叉搜索树,任意左子树的节点值都小于根节点的值,任意右子树的节点值都大于根节点的值
2、二叉搜索树的子树仍为二叉搜索树,具有二叉搜索性。
3、后序遍历的顺序为:左->右->根

基于上面的三个性质,我们应该想到,
1、此题中输入列表的最后一个元素为该二叉树的根节点(假设该数组是二叉搜索树的后序遍历结果),2、从第一个元素往后遍历,第一个大于根节点的元素即为该二叉树右子树的第一个元素,该元素之前为该二叉树的左子树。
3、遍历右子树,若其中某一元素小于根节点则程序返回False
4、由于二叉搜索树的子树仍为二叉搜索树,所以利用递归分别判断左右子树是否仍为二叉搜索树

代码实现

class Solution:
    def verifySequenceOfBST(self, sequence):
        """
        :type sequence: List[int]
        :rtype: bool
        """
        if not sequence:
            return True
        root = sequence[-1]
        n = len(sequence)
        for i in range(n):
            if sequence[i] > root:		# 找到第一个大于根节点的元素
                break
        for j in range(i, n-1):			# 遍历右子树
            if sequence[j] < root:	
                return False
        left = True
        if i > 0:
            left = self.verifySequenceOfBST(sequence[:i])		# 递归判断左子树
        right = True
        if i < n-1:
            right = self.verifySequenceOfBST(sequence[i:-1])	# 递归判断右子树
        return left and right
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值