题目:
题解:
- 思路1:使用区间 (l,r) 来判断以 root 为根节点的子树的所有节点值是否在这个范围内,若节点值不在这个范围内,则直接返回 false;否则我们需要继续递归左右子树看是否满足 BST 特性。进入左子树的话,上限变为 root->val;进入右子树的话,下限变为 root->val。
- 思路2:使用中序遍历,由于 BST 的中序序列是升序数组,因此用一个变量 pre 来记录前一个节点值,若当前遍历到的节点值小于等于 pre,则直接返回 false,否则继续递归。
代码如下:
// 思路1
class Solution {
public:
using LL = long long;
bool isValidBST(TreeNode* root) {
return dfs(root,LLONG_MIN,LLONG_MAX);
}
// 由于BST的左子树的所有节点值都小于根节点的值,右子树的所有节点值都大于根结点的值
// 所以用区间(left,right)来判断以root为根节点的所有子树的节点值是否在整个返回内,不在就返回false
bool dfs(TreeNode* root,LL left,LL right){
if(!root)return true;
if(root->val<=left||root->val>=right)return false;
// 进入左子树的话,上限就变成根节点的值了;进入右子树的话,下限变成根节点的值了
return dfs(root->left,left,root->val)&&dfs(root->right,root->val,right);
}
};
// 思路2
class Solution {
public:
// 中序遍历:判断当前节点的值是否小于前一个节点的值,若小于则满足BST特性;若大于等于,则不满足,直接返回false
using LL = long long;
LL pre=-1e10;
bool isValidBST(TreeNode* root) {
if(!root)return true;
// 左子树不满足BST返回false,单单左子树满足BST并不能说明整颗二叉树是BST
if(!isValidBST(root->left))return false;
if(pre>=root->val)return false;
// 更新前一个节点的值
pre=root->val;
return isValidBST(root->right);
}
};