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;
    }
};
posted @ 2022-05-27 14:33  失控D大白兔  阅读(15)  评论(0编辑  收藏  举报