Leetcode 98. 验证二叉搜索树

题目

给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。


递归

二叉搜索树的特性:该二叉树的左子树不为空,则左子树上的所有节点均小于根节点的值;若二叉树的右子树不为空,则右子树的所有节点均大于根节点的值。可以通过递归的方式递归判断。

#	时间复杂度:O(N)
#	空间复杂度:O(N)
class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        def bijiao(root, left, right):
            if not root:
                return True
            val = root.val
            #	确保val在left与right的开区间内
            if val<=left or val>=right:
                return False
            #	判断左子树的节点,要注意此时最大值已经变成了val
            if not bijiao(root.left, left, val):
                return False
            #	右子树节点判断同理
            if not bijiao(root.right, val, right):
                return False
            #	返回True
            return True
        return bijiao(root, float('-inf'), float('inf'))

中序遍历
递归实现

已知二叉搜索树的中序遍历得到的值一定是升序的,所以在中序遍历时检查当前节点是否大于前一个节点即可,可以首先构建中序遍历,之后在判断中间值时添加递归语句。

#	时间复杂度:O(N)
#	空间复杂度:O(N)
class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        self.pre = None
        def helper(root):
            #	中止条件
            if root == None:
                return True
            if helper(root.left) is False:
                return False
            #    process logic in current level 
            if self.pre and self.pre.val >= root.val:
                return False
            self.pre = root
            #   drill down
            if helper(root.right) is False:
                return False
            return True
        return helper(root)

C++版本

class Solution {
public:
    long long pre = LONG_MIN;
    bool isValidBST(TreeNode* root) {
        if (root == nullptr){
            return true;
        }
        if (isValidBST(root->left) == false){
            return false;
        }
        if (pre>=root->val){
            return false;
        }
        pre = root->val;
        if (isValidBST(root->right) == false){
            return false;
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值