#include <bits/stdc++.h>
using namespace std;
template <class T>
class BST;
template <class T>
class BSTNode {
T key;
BSTNode* left;
BSTNode* right;
public:
BSTNode() : left(nullptr), right(nullptr){}
BSTNode(const T& el, BSTNode* l = nullptr, BSTNode* r = nullptr) {
key = el;
left = l;
right = r;
}
BSTNode* getLeft() const {return left;}
BSTNode* getRight() const {return right;}
T& getKey() { return key; }
friend class BST<T>;
};
template <class T>
class BST {
protected:
BSTNode<T>* root;
public:
BST() {root = nullptr;}
void clear() {root = nullptr;}
bool isEmpty() {return root == nullptr;}
T* search(const T& el) {
BSTNode<T>* p = root;
while (p != nullptr) {
if (p->getKey() == el) {
return &(p->key);
}
if (p->getKey() < el) {
p = p->getRight();
}else p = p->getLeft();
}
return nullptr;
}
void insert(const T& el) {
BSTNode<T> *p = root, *prev = nullptr;
//finding a place to insert the new node
while (p != nullptr) {
prev = p;
if (p->key < el) p = p->right;
else p = p->left;
}
//inserting the new node
if (root == nullptr) root = new BSTNode<T>(el);
else if (prev->key < el) {
prev->right = new BSTNode<T>(el);
}else prev->left = new BSTNode<T>(el);
}
};
int main() {
BST<int> binary;
binary.insert(15);
binary.insert(20);
int* found = binary.search(15);
cout << *found;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBCU1Q7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgQlNUTm9kZSB7CiAgICBUIGtleTsKICAgIEJTVE5vZGUqIGxlZnQ7CiAgICBCU1ROb2RlKiByaWdodDsKCnB1YmxpYzoKICAgIEJTVE5vZGUoKSA6IGxlZnQobnVsbHB0ciksIHJpZ2h0KG51bGxwdHIpe30KICAgIEJTVE5vZGUoY29uc3QgVCYgZWwsIEJTVE5vZGUqIGwgPSBudWxscHRyLCBCU1ROb2RlKiByID0gbnVsbHB0cikgewogICAgICAgIGtleSA9IGVsOwogICAgICAgIGxlZnQgPSBsOwogICAgICAgIHJpZ2h0ID0gcjsKICAgIH0KICAgIEJTVE5vZGUqIGdldExlZnQoKSBjb25zdCB7cmV0dXJuIGxlZnQ7fQogICAgQlNUTm9kZSogZ2V0UmlnaHQoKSBjb25zdCB7cmV0dXJuIHJpZ2h0O30KICAgIFQmIGdldEtleSgpIHsgcmV0dXJuIGtleTsgfQogICAgZnJpZW5kIGNsYXNzIEJTVDxUPjsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBCU1Qgewpwcm90ZWN0ZWQ6CiAgICBCU1ROb2RlPFQ+KiByb290OwpwdWJsaWM6CiAgICBCU1QoKSB7cm9vdCA9IG51bGxwdHI7fQogICAgdm9pZCBjbGVhcigpIHtyb290ID0gbnVsbHB0cjt9CiAgICBib29sIGlzRW1wdHkoKSB7cmV0dXJuIHJvb3QgPT0gbnVsbHB0cjt9CgogICAgVCogc2VhcmNoKGNvbnN0IFQmIGVsKSB7CiAgICAgICAgQlNUTm9kZTxUPiogcCA9IHJvb3Q7CiAgICAgICAgd2hpbGUgKHAgIT0gbnVsbHB0cikgewogICAgICAgICAgICBpZiAocC0+Z2V0S2V5KCkgPT0gZWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAmKHAtPmtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHAtPmdldEtleSgpIDwgZWwpIHsKICAgICAgICAgICAgICAgIHAgPSBwLT5nZXRSaWdodCgpOwogICAgICAgICAgICB9ZWxzZSBwID0gcC0+Z2V0TGVmdCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgIH0KCiAgICB2b2lkIGluc2VydChjb25zdCBUJiBlbCkgewogICAgICAgIEJTVE5vZGU8VD4gKnAgPSByb290LCAqcHJldiA9IG51bGxwdHI7CgogICAgICAgIC8vZmluZGluZyBhIHBsYWNlIHRvIGluc2VydCB0aGUgbmV3IG5vZGUKICAgICAgICB3aGlsZSAocCAhPSBudWxscHRyKSB7CiAgICAgICAgICAgIHByZXYgPSBwOwogICAgICAgICAgICBpZiAocC0+a2V5IDwgZWwpIHAgPSBwLT5yaWdodDsKICAgICAgICAgICAgZWxzZSBwID0gcC0+bGVmdDsKICAgICAgICB9CgogICAgICAgIC8vaW5zZXJ0aW5nIHRoZSBuZXcgbm9kZQogICAgICAgIGlmIChyb290ID09IG51bGxwdHIpIHJvb3QgPSBuZXcgQlNUTm9kZTxUPihlbCk7CiAgICAgICAgZWxzZSBpZiAocHJldi0+a2V5IDwgZWwpIHsKICAgICAgICAgICAgcHJldi0+cmlnaHQgPSBuZXcgQlNUTm9kZTxUPihlbCk7CiAgICAgICAgfWVsc2UgcHJldi0+bGVmdCA9IG5ldyBCU1ROb2RlPFQ+KGVsKTsKICAgIH0KfTsKCgoKaW50IG1haW4oKSB7CiAgICBCU1Q8aW50PiBiaW5hcnk7CiAgICBiaW5hcnkuaW5zZXJ0KDE1KTsKICAgIGJpbmFyeS5pbnNlcnQoMjApOwogICAgaW50KiBmb3VuZCA9IGJpbmFyeS5zZWFyY2goMTUpOwogICAgY291dCA8PCAqZm91bmQ7CgogICAgcmV0dXJuIDA7Cn0KCg==