/**
* 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 的值可以重複要怎麼解