class Solution {
public:
long long prev=-0x3f3f3f3f3f3f3f3f;
bool isValidBST(TreeNode* root) {
if(root==nullptr) return true;
bool left=isValidBST(root->left);
bool cur=false;
if(root->val>prev) cur=true;
prev=root->val;
bool right=isValidBST(root->right);
return left&&right&&cur;
}
};
2 前序遍历
class Solution {
public:
bool isValidBST(TreeNode *root, long left = LONG_MIN, long right = LONG_MAX) {
if (root == nullptr)
return true;
long x = root->val;
return left < x && x < right &&
isValidBST(root->left, left, x) &&
isValidBST(root->right, x, right);
}
};
后序遍历
class Solution {
pair<long, long> dfs(TreeNode *node) {
if (node == nullptr)
return {LONG_MAX, LONG_MIN};
auto[l_min, l_max] = dfs(node->left);
auto[r_min, r_max] = dfs(node->right);
long x = node->val;
// 也可以在递归完左子树之后立刻判断,如果发现不是二叉搜索树,就不用递归右子树了
if (x <= l_max || x >= r_min)
return {LONG_MIN, LONG_MAX};
return {min(l_min, x), max(r_max, x)};
}
public:
bool isValidBST(TreeNode *root) {
return dfs(root).second != LONG_MAX;
}
};