/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: bool isValidBSTRec(TreeNode* root, int* min, int* max) { if (root->left && root->right) { int leftMin, leftMax, rightMin, rightMax; if (!isValidBSTRec(root->left, &leftMin, &leftMax) || !isValidBSTRec(root->right, &rightMin, &rightMax)) { return false; } *min = std::min(std::min(leftMin, rightMin), root->val); *max = std::max(std::max(leftMax, rightMax), root->val); return (leftMax < root->val) && (root->val < rightMin); } else if (root->left) { int leftMin, leftMax; if (!isValidBSTRec(root->left, &leftMin, &leftMax)) { return false; } *min = std::min(leftMin, root->val); *max = std::max(leftMax, root->val); return (leftMax < root->val); } else if (root->right) { int rightMin, rightMax; if (!isValidBSTRec(root->right, &rightMin, &rightMax)) { return false; } *min = std::min(rightMin, root->val); *max = std::max(rightMax, root->val); return (root->val < rightMin); } else { *min = *max = root->val; return true; } } bool isValidBST(TreeNode* root) { if (!root) return true; int minVal, maxVal; return isValidBSTRec(root, &minVal, &maxVal); } };