What if you could instantly know if your tree is perfectly ordered without checking every single connection?
Why Validate if Tree is BST in DSA C++?
Imagine you have a family tree drawn on paper, and you want to check if it follows a special rule: every parent is bigger than all members in the left branch and smaller than all members in the right branch. Doing this by looking at each person and comparing with all others manually is tiring and confusing.
Manually checking each node against all others is slow and easy to mess up. You might forget to check some branches or compare the wrong nodes. This can lead to wrong conclusions and lots of wasted time.
Using a smart method to check the tree step-by-step, comparing nodes only with allowed value ranges, quickly tells if the tree follows the rule. This method is clear, fast, and avoids mistakes.
bool isBST(Node* root) {
// Check all nodes against all others manually
// Very complex and slow
return false; // placeholder
}bool isBST(Node* node, int min, int max) {
if (!node) return true;
if (node->value <= min || node->value >= max) return false;
return isBST(node->left, min, node->value) && isBST(node->right, node->value, max);
}This lets you quickly and correctly verify if a tree is a Binary Search Tree, enabling efficient searching and sorting operations.
When building a phone contact list stored as a tree, you want to ensure it is a BST so that searching for a contact is fast and reliable.
Manual checking of tree order is slow and error-prone.
Using value range checks at each node simplifies validation.
Validating BST ensures efficient data operations like search.
Practice
Solution
Step 1: Understand BST property
A BST requires that for each node, values in the left subtree are smaller and values in the right subtree are larger.Step 2: Compare other options
Options B, C, and D describe other tree properties but not BST specifically.Final Answer:
For every node, all nodes in the left subtree are smaller and all nodes in the right subtree are larger. -> Option BQuick Check:
BST property = left < node < right [OK]
- Confusing BST with balanced tree
- Thinking all nodes must have two children
- Assuming leaf nodes must be at same depth
Solution
Step 1: Check parameter types
To check BST, we need a pointer to the root node and min/max limits to validate node values.Step 2: Validate function signature
bool isBST(Node* root, int min, int max); uses Node* root and both min and max parameters, which is correct for BST validation.Final Answer:
bool isBST(Node* root, int min, int max); -> Option AQuick Check:
Use pointer and min/max for BST check [OK]
- Passing Node by value instead of pointer
- Missing max parameter
- Using incorrect parameter types
#include <iostream>
#include <climits>
struct Node {
int data;
Node* left;
Node* right;
};
bool isBSTUtil(Node* root, int min, int max) {
if (!root) return true;
if (root->data <= min || root->data >= max) return false;
return isBSTUtil(root->left, min, root->data) && isBSTUtil(root->right, root->data, max);
}
bool isBST(Node* root) {
return isBSTUtil(root, INT_MIN, INT_MAX);
}
int main() {
Node n1 = {10, nullptr, nullptr};
Node n2 = {5, nullptr, nullptr};
Node n3 = {15, nullptr, nullptr};
n1.left = &n2;
n1.right = &n3;
std::cout << (isBST(&n1) ? "Yes" : "No") << std::endl;
return 0;
}Solution
Step 1: Analyze tree structure
Root is 10, left child 5 < 10, right child 15 > 10, so BST property holds.Step 2: Check BST validation function
Function correctly checks node values within min and max limits recursively.Final Answer:
Yes -> Option DQuick Check:
Tree satisfies BST rules = Yes [OK]
- Confusing <= and < in comparisons
- Not passing correct min/max values
- Ignoring nullptr base case
bool isBSTUtil(Node* root, int min, int max) {
if (!root) return true;
if (root->data < min || root->data > max) return false;
return isBSTUtil(root->left, min, root->data) && isBSTUtil(root->right, root->data, max);
}Solution
Step 1: Check comparison operators
BST requires strict inequality: node values must be greater than min and less than max, so use <= and >= to reject equal values.Step 2: Validate base case and recursion
Base case returning true for nullptr is correct; recursion is necessary; min and max parameters are correctly passed.Final Answer:
The comparison should use <= min and >= max to exclude equal values. -> Option CQuick Check:
Use strict inequalities to validate BST [OK]
- Allowing equal values breaks BST property
- Returning false on nullptr causes errors
- Swapping min and max in recursion
Solution
Step 1: Understand duplicate placement rule
Duplicates allowed only on right subtree means left subtree nodes must be strictly less than root.Step 2: Adjust comparison operators
Left subtree check uses < min (strict), right subtree check uses >= max (allow equal or greater).Final Answer:
Allow duplicates on right subtree by changing left subtree check to root->data < min and right subtree check to root->data >= max. -> Option AQuick Check:
Duplicates only right = left < root, right >= root [OK]
- Allowing duplicates on left subtree incorrectly
- Using <= on left subtree allowing duplicates there
- Not adjusting comparisons for duplicates
Ready to prove it?
Pass the test and this pattern moves unknown
