LeetCode/验证二叉搜索树
1.递归判断
从上往下递归的时候,使左边所有子树都小于根节点,右边所有子树都大于根节点
那么对于左子树要传入一个上界,对右子树传入一个下界
为了同一操作,对左右子树既传入上界也传入下界,并且上下界值会随着节点的更新发生改变,范围逐渐收缩
class Solution {
public:
bool helper(TreeNode* root, long long lower, long long upper) {
if (root == nullptr) //边界条件,为空返回真
return true;
if (root -> val <= lower || root -> val >= upper)
return false;//若不在上层节点的约束范围内,返回假
return helper(root -> left, lower, root -> val) && helper(root -> right, root -> val, upper);//对于左右子节点继续收缩更新范围
}
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX);//一开始传入一个极大范围,方便收缩
}
};
2.中遍历升序
按照中序遍历的方式访问,每次只需记录前一个节点值,若不是严格升序返回假,遍历完返回真
class Solution {
public:
long pre = LONG_MIN;
bool isValidBST(TreeNode* root) {
if(!root) return true;
bool left = isValidBST(root->left);
if(pre>=root->val||!left) return false;
pre = root->val;
bool right = isValidBST(root->right);
return left&right;
}
};
栈中序遍历
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> stack;
long long inorder = (long long)INT_MIN - 1;
while (!stack.empty() || root != nullptr) {
while (root != nullptr) {
stack.push(root);
root = root -> left;
}
root = stack.top();
stack.pop();
// 如果中序遍历得到的节点的值小于等于前一个 inorder,说明不是二叉搜索树
if (root -> val <= inorder) {
return false;
}
inorder = root -> val;
root = root -> right;
}
return true;
}
};