* Definition for a binary tree node.
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX);
bool helper(const TreeNode* root, long min, long max) {
if (root == nullptr) return true;
if (root->val >= max || root->val <= min) return false;
return helper(root->left, min, root->val) && helper(root->right, root->val, max);
bool isValidBST(TreeNode* root) {
if (root == nullptr) return true;
auto ranges = queue<pair<long, long>>();
ranges.push(make_pair(LONG_MIN, LONG_MAX));
auto nodes = queue<const TreeNode*>();
for (auto i = 0; i < sz; ++i) {
auto range = ranges.front();
if (n->val >= range.second || n->val <= range.first) {
if (n->left != nullptr) {
ranges.push(make_pair(range.first, n->val));
if (n->right != nullptr) {
ranges.push(make_pair(n->val, range.second));