#include <iostream>
#include <limits>
using namespace std;
struct Node {
int val;
Node* left;
Node* right;
Node(int v) : val(v), left(nullptr), right(nullptr) {}
};
bool isBSTUtil(Node* node, long long minVal, long long maxVal) {
if (node == nullptr) return true; // empty node is valid
if (node->val <= minVal || node->val >= maxVal) return false; // violates BST range
// check left subtree with updated max
if (!isBSTUtil(node->left, minVal, node->val)) return false;
// check right subtree with updated min
if (!isBSTUtil(node->right, node->val, maxVal)) return false;
return true; // current node valid and subtrees valid
}
bool isBST(Node* root) {
return isBSTUtil(root, LLONG_MIN, LLONG_MAX);
}
int main() {
// Construct tree:
// 5
// / \
// 3 7
// / \ \
// 2 4 8
Node* root = new Node(5);
root->left = new Node(3);
root->right = new Node(7);
root->left->left = new Node(2);
root->left->right = new Node(4);
root->right->right = new Node(8);
cout << boolalpha << isBST(root) << endl;
return 0;
}if (node == nullptr) return true; // empty node is valid
base case: empty subtree is valid BST
if (node->val <= minVal || node->val >= maxVal) return false; // violates BST range
check current node value against allowed min and max range
if (!isBSTUtil(node->left, minVal, node->val)) return false;
recursively check left subtree with updated max limit
if (!isBSTUtil(node->right, node->val, maxVal)) return false;
recursively check right subtree with updated min limit
return true; // current node valid and subtrees valid
all checks passed, subtree is BST