验证二叉搜索树(抄的)

文章介绍了三种方法来验证二叉搜索树的合法性:利用二叉搜索树的性质进行中序遍历检查,前序遍历递归比较节点值,以及后序遍历通过深度优先搜索确定节点范围。每种方法都展示了如何通过比较节点值与已访问节点的范围来判断是否为有效的二叉搜索树。
摘要由CSDN通过智能技术生成

题解

1 利用二叉搜索树性质(二叉搜索树的中序遍历是有序的)

class Solution {
public:
    long long prev=-0x3f3f3f3f3f3f3f3f;
    bool isValidBST(TreeNode* root) {
        if(root==nullptr) return true;
        bool left=isValidBST(root->left);
        bool cur=false;
        if(root->val>prev) cur=true;
        prev=root->val;
        bool right=isValidBST(root->right);
        return left&&right&&cur;
    }
};

2 前序遍历

class Solution {
public:
    bool isValidBST(TreeNode *root, long left = LONG_MIN, long right = LONG_MAX) {
        if (root == nullptr)
            return true;
        long x = root->val;
        return left < x && x < right &&
               isValidBST(root->left, left, x) &&
               isValidBST(root->right, x, right);
    }
};

后序遍历

class Solution {
    pair<long, long> dfs(TreeNode *node) {
        if (node == nullptr)
            return {LONG_MAX, LONG_MIN};
        auto[l_min, l_max] = dfs(node->left);
        auto[r_min, r_max] = dfs(node->right);
        long x = node->val;
        // 也可以在递归完左子树之后立刻判断,如果发现不是二叉搜索树,就不用递归右子树了
        if (x <= l_max || x >= r_min)
            return {LONG_MIN, LONG_MAX};
        return {min(l_min, x), max(r_max, x)};
    }

public:
    bool isValidBST(TreeNode *root) {
        return dfs(root).second != LONG_MAX;
    }
};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值