LeetCode 98 Validate Binary Search Tree

289 阅读1分钟

LeetCode 98 Validate Binary Search Tree

思路

解法1

对一个BST中序遍历,结果将是一个上升序列。首先想到的解法是,用一个变量pre记录前一次遍历的节点,然后比较前一次遍历的节点与目前遍历的节点之间的大小关系。

解法2

在遍历的过程中,每个节点的取值范围是有由其父节点或其祖先节点的值限定的。因此,只要在遍历的过程中维护好这个范围,每次检查当前节点是否满足此范围即可。

如果向左走,那么当前节点能取的最大值越来越小,则更新最大值。如果向右走,那么当前节点能取的最小值越来越大,更新最小值。

代码

解法1

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        stack<TreeNode*> stk;
        TreeNode *pre = nullptr;
        
        while (root || !stk.empty()) {
            while (root) {
                stk.push(root);
                root = root->left;
            }
            
            root = stk.top();
            stk.pop();
            if (pre && pre->val >= root->val) return false;
            pre = root;
            root = root->right;
        }
        
        return true;
    }
};

解法2

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        return isValidBST(root, nullptr, nullptr);
    }
    
    bool isValidBST(TreeNode *root, TreeNode *minNode, TreeNode *maxNode) {
        if (!root) return true;
        else if (minNode && root->val <= minNode->val || maxNode && root->val >= maxNode->val) 
            return false;
        else return isValidBST(root->left, minNode, root) && isValidBST(root->right, root, maxNode);
    }
};