zlatan的算法笔记20--验证二叉搜索树(力扣98题)

算法笔记

本题为验证二叉搜索树,本题乍一看比较简单,但很容易陷入某种误区,注意避坑。

题目描述

在这里插入图片描述

解题思路

常规思路

我们知道二叉搜索树其实就是一个有序数组,判断是否是二叉搜索树就相当于判断是否是有序数组,就可以考虑定义一个数组vec,通过中序遍历(看见二叉搜索树优先中序)将元素装入数组中,然后另加一个for循环即可就可以解决本题。

递归思路

递归思路也并不难理解,我们需要定义一个最小值去与节点的值进行比较,如果每个节点符合条件即可,不符合就返回false。这里有一个陷阱就是力扣当中后台数据有int最小值测试用例,所以都把应该改成了longlong最小值即可。

误区

不能单纯的比较左节点小于中间节点,右节点大于中间节点。判断是否为二叉搜索树要比较左子树所有节点小于中间节点,右子树所有节点大于中间节点才可以。

代码部分

常规思路

class Solution {
private:
    vector<int> vec;
    void traversal(TreeNode* root) {
        if (root == NULL) return;
        traversal(root->left);
        vec.push_back(root->val);
        traversal(root->right);
    }
public:
    bool isValidBST(TreeNode* root) {
        vec.clear();
        traversal(root);
        for (int i = 1; i < vec.size(); i++) {
            if (vec[i] <= vec[i - 1]) return false;
        }
        return true;
    }
};

递归方法

class Solution {
public:
    long long maxValue = LONG_MIN;
    bool isValidBST(TreeNode* root) {
        if(root == nullptr) {
            return true;
        }
        bool left = isValidBST(root->left);
        if(root->val > maxValue) {
            maxValue = root->val;
        }else {
            return false;
        }
        bool right = isValidBST(root->right);
        return left && right;
    }
};

结语

本题容易掉入陷阱,跳出陷阱本题就可以迎刃而解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值