# 98 - Validate Binary Search Tree

解法一 - Recursion

這題也可以用 Divide and Conquer 來解,只要確定兩棵子樹都是 BST 就可以,其中用到的技巧就是在檢查新的子樹時要考慮新的上下限:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if(!root || (!root->left && !root->right)) return true;

        return validBST(root->left, INT_MIN, root->val) && validBST(root->right, root->val, INT_MAX);
    }

private:
    bool validBST(TreeNode* root, int lowerBound, int upperBound) {
        if(!root) return true;

        if(root->val >= upperBound || root->val <= lowerBound)
            return false;

        return validBST(root->left, lowerBound, root->val) && validBST(root->right, root->val, upperBound);
    }
};

這段 code 隱含一個假設,就是 node val 不會有 INT_MIN 跟 INT_MAX,不過這些值在 test case 中,所以上面這段 code 是過不了的。

為了避免這個問題,最好的方法就是完全排除掉 INT_MIN 跟 INT_MAX,這樣子寫出來的 code 就不會有 test value dependency 的問題,實作如下:

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        return isValidBST(root, NULL, NULL);
    }

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

解法二 - 用 Inorder traversal 走完要是一個有序的數列

Follow Up - 如果 tree node 的值可以重複要怎麼解

Last updated