Hot100-Day46-T98验证二叉搜索树

0 阅读2分钟

Day46[26/4/15]T98验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 严格小于 当前节点的数。
  • 节点的右子树只包含 严格大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4

提示:

  • 树中节点数目范围在[1, 104]
  • -231 <= Node.val <= 231 - 1

解题思路

中序遍历,并且保证遍历的时候,相邻两次访问的数字符合严格升序。

因为要对两个数据进行比较,所以递归函数需要接受两个参数,此外还必须注意一点,由于要保存上一次的结果,所以需要一个固定的指针来保存,所以函数签名里面一定要注意 & ,这个是最最大的坑

bool check(TreeNode *root, TreeNode *&prev)

Code

struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution
{
public:
    bool isValidBST(TreeNode *root)
    {
        if (root == nullptr)
        {
            return true;
        }

        // 指向上一个节点
        TreeNode *prev = nullptr;

        // 1. 中序遍历,升序即可
        return check(root, prev);
    }

private:
    bool check(TreeNode *root, TreeNode *&prev)
    {
        if (root == nullptr)
        {
            return true;
        }

        // 1. 中序遍历,先左,再访问自己,最后访问右侧
        if (check(root->left, prev) == false)
        {
            return false;
        }

        if (prev != nullptr && root->val <= prev->val)
        {
            // 不严格升序
            return false;
        }

        // 不论如何都需要记录成上一个节点
        prev = root;

        if (check(root->right, prev) == false)
        {
            return false;
        }

        return true;
    }
};