#include <iostream>
using namespace std;
struct Node {
int key;
Node *left, *right;
Node(int val) {
key = val;
left = NULL;
right = NULL;
}
};
// Check for BST
bool isBST(Node *root, Node *min = NULL, Node *max = NULL) {
if (root == NULL)
return true;
if (min != NULL && root->key <= min->key) {
return false;
}
if (max != NULL && root->key >= max->key) {
return false;
}
bool leftValid = isBST(root->left, min, root);
bool rightValid = isBST(root->right, root, max);
return leftValid && rightValid;
}
int main() {
Node *root1 = new Node(2); // Fixing root key to 2
root1->left = new Node(1); // Inserting 1 as left child
root1->right = new Node(3); // Inserting 3 as right child
if (isBST(root1, NULL, NULL))
cout << "Valid BST" << endl;
else
cout << "Invalid BST" << endl;
return 0;
}
ICNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBOb2RlIHsKICAgIGludCBrZXk7CiAgICBOb2RlICpsZWZ0LCAqcmlnaHQ7CiAgICBOb2RlKGludCB2YWwpIHsKICAgICAgICBrZXkgPSB2YWw7CiAgICAgICAgbGVmdCA9IE5VTEw7CiAgICAgICAgcmlnaHQgPSBOVUxMOwogICAgfQp9OwoKLy8gQ2hlY2sgZm9yIEJTVApib29sIGlzQlNUKE5vZGUgKnJvb3QsIE5vZGUgKm1pbiA9IE5VTEwsIE5vZGUgKm1heCA9IE5VTEwpIHsKICAgIGlmIChyb290ID09IE5VTEwpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICBpZiAobWluICE9IE5VTEwgJiYgcm9vdC0+a2V5IDw9IG1pbi0+a2V5KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKG1heCAhPSBOVUxMICYmIHJvb3QtPmtleSA+PSBtYXgtPmtleSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGJvb2wgbGVmdFZhbGlkID0gaXNCU1Qocm9vdC0+bGVmdCwgbWluLCByb290KTsKICAgIGJvb2wgcmlnaHRWYWxpZCA9IGlzQlNUKHJvb3QtPnJpZ2h0LCByb290LCBtYXgpOwogICAgcmV0dXJuIGxlZnRWYWxpZCAmJiByaWdodFZhbGlkOwp9CgppbnQgbWFpbigpIHsKICAgIE5vZGUgKnJvb3QxID0gbmV3IE5vZGUoMik7IC8vIEZpeGluZyByb290IGtleSB0byAyCiAgICByb290MS0+bGVmdCA9IG5ldyBOb2RlKDEpOyAvLyBJbnNlcnRpbmcgMSBhcyBsZWZ0IGNoaWxkCiAgICByb290MS0+cmlnaHQgPSBuZXcgTm9kZSgzKTsgLy8gSW5zZXJ0aW5nIDMgYXMgcmlnaHQgY2hpbGQKCiAgICBpZiAoaXNCU1Qocm9vdDEsIE5VTEwsIE5VTEwpKQogICAgICAgIGNvdXQgPDwgIlZhbGlkIEJTVCIgPDwgZW5kbDsKICAgIGVsc2UKICAgICAgICBjb3V0IDw8ICJJbnZhbGlkIEJTVCIgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQo=