BST 中序遍历是单调递增的

中序遍历的思路对了,不过代码实现遇到了一点问题,看了一个评论区的代码。

class Solution {
private:
    long prev = LONG_MIN;
public:
    bool isValidBST(TreeNode* root) {
        if (!root) return true;
        bool L = isValidBST(root->left);
        
        if (root->val <= prev) return false;
        prev = root->val;
        
        bool R = isValidBST(root->right);
        return L && R;
    }
};

April 10, 2024

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        dfs(root);
        return res;
    }

    bool flag= true;
    long pre = LONG_MIN;
    void dfs(TreeNode* root) {
        if (!root) return;
        dfs(root->left);
        if (root->val <= pre) flag = false;
        pre = root->val;
        dfs(root->right);
    }
};
// 2024-03-06 中序遍历迭代 方式
class Solution {
public:
    bool isValidBST(TreeNode* root) {
        stack<TreeNode*> st;
        long pre = LONG_MIN;
        while (root || !st.empty()) {
            if (root) {
                st.push(root);
                root = root->left;
            } else {
                root = st.top();
                st.pop();
                if (root->val <= pre) {
                    return false;
                }
                pre = root->val;
                root = root->right;
            }
        }
        return true;
    }
};

另外一种思路是官方解答的递归

root->val 要在 (lower, upper) 范围内,初始化为 (LONG_MIN, LONG_MAX)

就是左子树是 (lower, root->val) 右子树 (root->val, upper) 再下一层继续,就是往左走就更新右边界,往右走就更新左边界

class Solution {
    bool helper(TreeNode* root, long lower, long upper) {
        if (!root) return true;
        if (root->val <= lower || root->val >= upper) {
            return false;
        }
        bool a = helper(root->left, lower, root->val);
        bool b = helper(root->right, root->val, upper);
        return a && b;
    }
public:
    bool isValidBST(TreeNode* root) {
        return helper(root, LONG_MIN, LONG_MAX);
    }
};