【LeetCode】98. 验证二叉搜索树

77 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

题目

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

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

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

示例 1

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

示例 2

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

提示

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

题解

思路

二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:

  • 若其左子树存在,则其左子树中每个节点的值都小于该节点值;
  • 若其右子树存在,则其右子树中每个节点的值都大于该节点值。

我们知道二叉搜索树中序遍历得到的值构成的序列一定是升序的的。因此我们可以对二叉树进行中序遍历,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明说明这个序列是升序的,整棵树是二叉搜索树,否则不是。

过程:

  1. 我们定义一个节点变量pre用来记录中序遍历的前一个节点。
  2. 中序遍历二叉树,在遍历过程中判断当前节点是否大于中序遍历的前一个节点。如果大于不做任何处理,如果小于等于说明不满足二叉搜索树的性质,返回false。

细节:

  1. pre节点的初始值要设置为null。
  2. 具体实现过程看代码。

代码

class Solution {
public:
    TreeNode* pre = nullptr;
    bool isValidBST(TreeNode* root) {
        if(!root)
            return true;
        //判断当前节点的左子树是否满足二叉搜索树,如果不满足,直接返回false,无序递归右子树
        if(!isValidBST(root->left))  return false; 
        //如果前一个节点不为空并且当前节点<=前一个节点,直接返回false
        if( pre && root->val <= pre->val) return false;
        //否则,将当前节点设置为pre
        pre = root;
        return isValidBST(root->right);
    }
};

结语

业精于勤,荒于嬉;行成于思,毁于随。