leetcode: 验证二叉搜索树(递归和中序遍历)

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:
    1.节点的左子树只包含小于当前节点的数。
    2.节点的右子树只包含大于当前节点的数。
    3.所有左子树和右子树自身必须也是二叉搜索树。

一刷:

这其实就是一个树的遍历问题,可以用递归或者中序遍历来解,两种解法的时间复杂度和空间复杂度都是O(n)

递归:

当往右子树遍历时,最大值变为当前节点,最小值不变,

当往左子树遍历时,最大值不变,最小值变为当前节点,

当前节点总是大于最小值,小于最大值。

class Solution:
    def isValidBST(self, root: TreeNode, lower = float('-inf'),upper = float('inf'),) -> bool:
        if root == None:
            return True
        else:
            if root.val <= lower:
                return False
            elif root.val >= upper:
                return False
            else:
                return self.isValidBST(root.right,lower = root.val,upper = upper) and self.isValidBST(root.left,lower = lower,upper = root.val)

中序遍历:

得到的序列总是升序序列

class Solution:
    def isValidBST(self, root):
        
        stack, inorder = [], float('-inf')
        
        while stack or root:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            if root.val <= inorder:
                return False
            inorder = root.val
            root = root.right

        return True

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值