Files
leetcode-master/problems/0098.验证二叉搜索树.md
youngyangyang04 304e409f48 Update
2020-08-13 09:15:50 +08:00

2.5 KiB
Raw Blame History

题目地址

思路

中序遍历下,输出的二叉搜索树节点的数值是有序序列,有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

所以代码实现上,我们就使用递归法来中序遍历,遍历的过程中判断节点上的数值是不是递增的就可以了。

这道题目比较容易陷入两个陷阱:

  • 陷阱1 [10,5,15,null,null,6,20] 这个case 要考虑道 二叉搜索树

10的右子树只能包含大于当前节点的数而右面出现了一个6 这就不符合了!

  • 陷阱2样例中根节点的val 可能是int的最小值

问题可以进一步演进如果样例中根节点的val 可能是longlong的最小值 又要怎么办呢?看下文解答!

C++代码

定于全局变量初始化为long long最小值

class Solution {
public:
    long long maxVal = LONG_MIN;
    bool isValidBST(TreeNode* root) {
        if (root == NULL) return true;
        bool left = isValidBST(root->left);
        // 中序遍历,验证遍历的元素是不是从小到大
        if (maxVal < root->val) maxVal = root->val;
        else return false;
        bool right = isValidBST(root->right);
        return left && right;
    }
};

其实因为后台数据有int最小值测试用例所以都改成了longlong最小值。

如果测试数据中有 longlong的最小值怎么办不可能在初始化一个更小的值了吧。 建议避免 初始化最小值,如下方法取到最左面的数值:

class Solution {
public:
    long long maxVal = 0; // 记录中序遍历的过程中出现过的最大值
    bool flag = false; // 标记是否取到了最左面节点的数值
    bool isValidBST(TreeNode* root) {
        if (root == NULL) return true;
        bool left = isValidBST(root->left);
        if (!flag) {
            maxVal = root->val;
            flag = true;
        } else {
            // 中序遍历,这里相当于从大到小进行比较
            if (maxVal < root->val) maxVal = root->val;
            else return false;
        }
        bool right = isValidBST(root->right);
        return left && right;
    }
};

更多算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。