98. 验证二叉搜索树

98. 验证二叉搜索树

看的题解。。

1.递归

  • 奇怪的思路增加了!
    树递归的时候可以用左右端点的范围。
class Solution {
public:
    bool isValidBST(TreeNode* root) {
        return dfs(root,LONG_MIN,LONG_MAX);
    }
    
    bool dfs(TreeNode *root,long long lower,long long upper){
        if(!root)return true;
        if(root->val<=lower || root->val>=upper)return false;
        return dfs(root->left,lower,root->val) && dfs(root->right,root->val,upper);
    }
};

2.中序遍历

中序遍历这个太巧了。
我自己写的,要跑两次n,相对容易理解一点

class Solution {
public:
    vector vec;
    bool isValidBST(TreeNode* root) {
        dfs(root);
        for(int i=1;i=vec[i])return false;
        return true;
    }
    
    void dfs(TreeNode *root){
        if(!root)return ;
        
        dfs(root->left);
        vec.push_back(root->val);
        dfs(root->right);
    }
};

官方题解的代码
非递归写法,用了一个栈。
相对不太好写。容易出错
但还是一个比较新的思路(对我来说

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        stack stack;
        long long inorder =LONG_MIN;

        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;
    }
};

你可能感兴趣的:(98. 验证二叉搜索树)