根据定义递归
class Solution {
public:
bool dfs(TreeNode* root,long long lower,long long upper){
if(root == nullptr)return true;
if(root->val <= lower || root->val >= upper)return false;
return dfs(root->left,lower,root->val) && dfs(root->right,root->val,upper);
}
bool isValidBST(TreeNode* root) {
return dfs(root,LONG_MIN,LONG_MAX);
// //这是类似平衡二叉树的判断方法,搜索二叉树行不通
// if(root == nullptr)return true;
// if(root->left != nullptr && root->left->val >= root->val)return false;
// else if(root->right != nullptr && root->right->val <= root->val)return false;
// return isValidBST(root->left) && isValidBST(root->right);
}
};
中序遍历
中序遍历下,输出的二叉搜索树节点的数值是有序序列。
有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了
可以使用一个变量记录最大值/上一个节点的值,若当前节点小于等于它就返回false。而本题节点val最小为INT_MIN,所以变量初始化只能为LONG_MIN(若也为INT_MIN则假设只有一个节点,val就是INT_MIN,本应是true却判为false)
若题目进一步将val最小改为LONG_MIN,不可能再初始化一个更小的值了。所以为了避免初始化,如下方法取到最左面节点的数值来比较。
class Solution {
public:
TreeNode* pre = nullptr;
bool isValidBST(TreeNode* root) {
if(root == nullptr)return true;
bool left = isValidBST(root->left);
if(pre != nullptr && pre->val >= root->val)return false;
pre = root;
bool right = isValidBST(root->right);
return left && right;
}
};
标签:right,return,val,23,nullptr,随想录,二叉树,root,left
From: https://www.cnblogs.com/neromegumi/p/18562414