可以看看这个B站的视频用前,中,后序的方法验证二叉树【验证二叉搜索树】 https://www.bilibili.com/video/BV14G411P7C1/?share_source=copy_web&vd_source=42514ba0d9ab57f6555d80bfeb9f5b81
前序遍历:
class Solution {
public:
bool isValidBST(TreeNode* root,long long left=LONG_MIN,long long right=LONG_MAX) {
if(root==nullptr){
return true;
}
int x=root->val;
return x>left && x<right &&isValidBST(root->left,left,x)&&isValidBST(root->right,x,right);
}
};
中序遍历:
class Solution {
long pre = LONG_MIN; // 记录当前节点之前的最大值,初始化为长整型能表示的最小值
public:
bool isValidBST(TreeNode *root) {
// 如果根节点为空,则返回 true,因为空树被认为是有效的 BST
if (root == nullptr)
return true;
// 如果左子树不满足 BST 的条件,或者当前节点的值小于等于上一个节点的值,则返回 false
if (!isValidBST(root->left) || root->val <= pre)
return false;
// 更新当前节点之前的最大值
pre = root->val;
// 递归检查右子树是否满足 BST 的条件
return isValidBST(root->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;
}
};