#include <iostream>
using namespace std;
struct Node {
int val;
Node* left;
Node* right;
Node(int v) : val(v), left(nullptr), right(nullptr) {}
};
// Insert node to keep BST property
Node* insert(Node* root, int val) {
if (!root) return new Node(val);
if (val < root->val) root->left = insert(root->left, val); // go left if smaller
else root->right = insert(root->right, val); // go right if bigger or equal
return root;
}
// Search for value using BST property
bool search(Node* root, int val) {
if (!root) return false; // reached leaf, not found
if (root->val == val) return true; // found value
if (val < root->val) return search(root->left, val); // go left if smaller
else return search(root->right, val); // go right if bigger or equal
}
int main() {
Node* root = nullptr;
int values[] = {5, 3, 7, 2, 4, 8};
for (int v : values) root = insert(root, v);
int target = 4;
if (search(root, target)) cout << "Found " << target << "\n";
else cout << target << " not found\n";
return 0;
}if (val < root->val) root->left = insert(root->left, val);
go left if new value is smaller to keep BST property
else root->right = insert(root->right, val);
go right if new value is bigger or equal to keep BST property
if (root->val == val) return true;
found the target value, stop search
if (val < root->val) return search(root->left, val);
go left if target is smaller, narrowing search
else return search(root->right, val);
go right if target is bigger or equal, narrowing search