验证二叉搜索树

98. 验证二叉搜索树 - 力扣(LeetCode)

可以看看这个B站的视频用前,中,后序的方法验证二叉树【验证二叉搜索树】 https://www.bilibili.com/video/BV14G411P7C1/?share_source=copy_web&vd_source=42514ba0d9ab57f6555d80bfeb9f5b81

前序遍历:

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

    }
};

中序遍历:

class Solution {  
    long pre = LONG_MIN; // 记录当前节点之前的最大值,初始化为长整型能表示的最小值  
  
public:  
    bool isValidBST(TreeNode *root) {  
        // 如果根节点为空,则返回 true,因为空树被认为是有效的 BST  
        if (root == nullptr)  
            return true;  
  
        // 如果左子树不满足 BST 的条件,或者当前节点的值小于等于上一个节点的值,则返回 false  
        if (!isValidBST(root->left) || root->val <= pre)  
            return false;  
  
        // 更新当前节点之前的最大值  
        pre = root->val;  
  
        // 递归检查右子树是否满足 BST 的条件  
        return isValidBST(root->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;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值