#include <iostream>
using namespace std;
class BinarySearchTree {
struct Node {
int data;
Node *left;
Node *right;
};
Node *root;
Node *insert( int value, Node *t) {
if(t == NULL) {
t = new Node;
t->data = value;
t->left = t->right = NULL;
} else if( value < t->data ) {
t->left = insert( value, t->left );
} else if( value > t->data ) {
t->right = insert(value, t->right);
}
return t;
}
Node *findMin(Node *t) {
if(t == NULL) {
return NULL;
} else if( t-> left == NULL ) {
return t;
} else {
return findMin( t->left );
}
}
Node *findMax(Node *t) {
if(t == NULL) {
return NULL;
} else if( t-> right == NULL ) {
return t;
} else {
return findMax( t->right );
}
}
Node* remove(int value, Node *t) {
Node *temp;
if(t == NULL) {
return NULL;
} else if(value < t->data) {
t->left = remove(value, t->left);
} else if(value > t->data) {
t->right = remove(value, t->right);
} else if(t->left != NULL && t->right != NULL) {
temp = findMin(t->right);
t->data = temp->data;
t->right = remove(t->data, t->right);
} else {
temp = t;
if(t->left == NULL) {
t = t->right;
} else if(t->right == NULL) {
t = t->left;
}
delete temp;
}
return t;
}
void inorder(Node *t) {
if(t == NULL) return;
inorder(t->left);
cout<<t->data<<" ";
inorder(t->right);
}
bool find(int value, Node *t) {
if(t == NULL) {
return false;
} else if(value < t->data) {
return find(value, t->left);
} else if(value > t->data) {
return find(value, t->right);
} else {
return true;
}
}
public:
//constructor
BinarySearchTree() {
root = NULL;
}
//destructor
~BinarySearchTree() {
}
void insert(int value) {
root = insert(value, root);
}
void remove(int value) {
root = remove(value, root);
}
bool search( int value ) {
return find(value, root);
}
void display() {
inorder( root );
cout<<"\n";
}
};
int main(int argc, char const *argv[]) {
BinarySearchTree bst;
bst.insert(-8);
bst.insert(-71);
bst.insert(117);
bst.insert(-1);
bst.insert(2);
bst.insert(13);
bst.insert(7);
bst.insert(8);
bst.insert(17);
bst.display();
cout<<bst.search(8);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEJpbmFyeVNlYXJjaFRyZWUgewoKICAgICAgc3RydWN0IE5vZGUgewoKICAgICAgICAgICAgIGludCBkYXRhOwoKICAgICAgICAgICAgIE5vZGUgKmxlZnQ7CgogICAgICAgICAgICAgTm9kZSAqcmlnaHQ7CiAgICAgIH07CgogICAgICBOb2RlICpyb290OwoKICAgICAgTm9kZSAqaW5zZXJ0KCBpbnQgdmFsdWUsIE5vZGUgKnQpIHsKCiAgICAgICAgICAgIGlmKHQgPT0gTlVMTCkgewoKICAgICAgICAgICAgICAgdCA9IG5ldyBOb2RlOwoKICAgICAgICAgICAgICAgdC0+ZGF0YSA9IHZhbHVlOwoKICAgICAgICAgICAgICAgdC0+bGVmdCA9IHQtPnJpZ2h0ID0gTlVMTDsKCiAgICAgICAgICAgIH0gZWxzZSBpZiggdmFsdWUgPCB0LT5kYXRhICkgewoKICAgICAgICAgICAgICAgdC0+bGVmdCA9IGluc2VydCggdmFsdWUsIHQtPmxlZnQgKTsKCiAgICAgICAgICAgIH0gZWxzZSBpZiggdmFsdWUgPiB0LT5kYXRhICkgewoKICAgICAgICAgICAgICAgdC0+cmlnaHQgPSBpbnNlcnQodmFsdWUsIHQtPnJpZ2h0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0OwogICAgICB9CgogICAgICBOb2RlICpmaW5kTWluKE5vZGUgKnQpIHsKCiAgICAgICAgICAgaWYodCA9PSBOVUxMKSB7CgogICAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICAgICB9IGVsc2UgaWYoIHQtPiBsZWZ0ID09IE5VTEwgKSB7CgogICAgICAgICAgICAgIHJldHVybiB0OwoKICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgIHJldHVybiBmaW5kTWluKCB0LT5sZWZ0ICk7CiAgICAgICAgICAgfQogICAgICB9CgogICAgICBOb2RlICpmaW5kTWF4KE5vZGUgKnQpIHsKCiAgICAgICAgICAgaWYodCA9PSBOVUxMKSB7CgogICAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICAgICB9IGVsc2UgaWYoIHQtPiByaWdodCA9PSBOVUxMICkgewoKICAgICAgICAgICAgICByZXR1cm4gdDsKCiAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICByZXR1cm4gZmluZE1heCggdC0+cmlnaHQgKTsKICAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIE5vZGUqIHJlbW92ZShpbnQgdmFsdWUsIE5vZGUgKnQpIHsKCiAgICAgICAgICAgIE5vZGUgKnRlbXA7CgogICAgICAgICAgICBpZih0ID09IE5VTEwpIHsKCiAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICAgICAgfSBlbHNlIGlmKHZhbHVlIDwgdC0+ZGF0YSkgewoKICAgICAgICAgICAgICAgdC0+bGVmdCA9IHJlbW92ZSh2YWx1ZSwgdC0+bGVmdCk7CgogICAgICAgICAgICB9IGVsc2UgaWYodmFsdWUgPiB0LT5kYXRhKSB7CgogICAgICAgICAgICAgIHQtPnJpZ2h0ID0gcmVtb3ZlKHZhbHVlLCB0LT5yaWdodCk7CgogICAgICAgICAgICB9IGVsc2UgaWYodC0+bGVmdCAhPSBOVUxMICYmIHQtPnJpZ2h0ICE9IE5VTEwpIHsKCiAgICAgICAgICAgICAgICB0ZW1wID0gZmluZE1pbih0LT5yaWdodCk7CgogICAgICAgICAgICAgICAgdC0+ZGF0YSA9IHRlbXAtPmRhdGE7CgogICAgICAgICAgICAgICAgdC0+cmlnaHQgPSByZW1vdmUodC0+ZGF0YSwgdC0+cmlnaHQpOwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICB0ZW1wID0gdDsKCiAgICAgICAgICAgICAgICBpZih0LT5sZWZ0ID09IE5VTEwpIHsKCiAgICAgICAgICAgICAgICAgICB0ID0gdC0+cmlnaHQ7CgogICAgICAgICAgICAgICAgfSBlbHNlIGlmKHQtPnJpZ2h0ID09IE5VTEwpIHsKCiAgICAgICAgICAgICAgICAgICB0ID0gdC0+bGVmdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBkZWxldGUgdGVtcDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgIH0KCiAgICAgIHZvaWQgaW5vcmRlcihOb2RlICp0KSB7CgogICAgICAgICAgIGlmKHQgPT0gTlVMTCkgcmV0dXJuOwoKICAgICAgICAgICBpbm9yZGVyKHQtPmxlZnQpOwoKICAgICAgICAgICBjb3V0PDx0LT5kYXRhPDwiICI7CgogICAgICAgICAgIGlub3JkZXIodC0+cmlnaHQpOwogICAgICB9CgogICAgICBib29sIGZpbmQoaW50IHZhbHVlLCBOb2RlICp0KSB7CgogICAgICAgICAgIGlmKHQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgIH0gZWxzZSBpZih2YWx1ZSA8IHQtPmRhdGEpIHsKICAgICAgICAgICAgIHJldHVybiBmaW5kKHZhbHVlLCB0LT5sZWZ0KTsKICAgICAgICAgICB9IGVsc2UgaWYodmFsdWUgPiB0LT5kYXRhKSB7CiAgICAgICAgICAgICByZXR1cm4gZmluZCh2YWx1ZSwgdC0+cmlnaHQpOwogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIHB1YmxpYzoKCiAgICAgICAgIC8vY29uc3RydWN0b3IKICAgICAgICAgQmluYXJ5U2VhcmNoVHJlZSgpIHsKCiAgICAgICAgICAgICByb290ID0gTlVMTDsKICAgICAgICAgfQoKICAgICAgICAgLy9kZXN0cnVjdG9yCiAgICAgICAgIH5CaW5hcnlTZWFyY2hUcmVlKCkgewogICAgICAgICB9CgogICAgICAgICB2b2lkIGluc2VydChpbnQgdmFsdWUpIHsKCiAgICAgICAgICAgICByb290ID0gaW5zZXJ0KHZhbHVlLCByb290KTsKICAgICAgICAgfQoKICAgICAgICAgdm9pZCByZW1vdmUoaW50IHZhbHVlKSB7CgogICAgICAgICAgICAgcm9vdCA9IHJlbW92ZSh2YWx1ZSwgcm9vdCk7CiAgICAgICAgIH0KCiAgICAgICAgIGJvb2wgc2VhcmNoKCBpbnQgdmFsdWUgKSB7CgogICAgICAgICAgICAgIHJldHVybiBmaW5kKHZhbHVlLCByb290KTsKICAgICAgICAgfQoKICAgICAgICAgdm9pZCBkaXNwbGF5KCkgewoKICAgICAgICAgICAgICBpbm9yZGVyKCByb290ICk7CgogICAgICAgICAgICAgIGNvdXQ8PCJcbiI7CiAgICAgICAgIH0KfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyIGNvbnN0ICphcmd2W10pIHsKCiAgIEJpbmFyeVNlYXJjaFRyZWUgYnN0OwoKICAgICAgICBic3QuaW5zZXJ0KC04KTsKICAgICAgICBic3QuaW5zZXJ0KC03MSk7CiAgICAgICAgYnN0Lmluc2VydCgxMTcpOwogICAgICAgIGJzdC5pbnNlcnQoLTEpOwogICAgICAgIGJzdC5pbnNlcnQoMik7CiAgICAgICAgYnN0Lmluc2VydCgxMyk7CiAgICAgICAgYnN0Lmluc2VydCg3KTsKICAgICAgICBic3QuaW5zZXJ0KDgpOwogICAgICAgIGJzdC5pbnNlcnQoMTcpOwogICAgICAgIGJzdC5kaXNwbGF5KCk7CiAgICAgICAgY291dDw8YnN0LnNlYXJjaCg4KTsKICAgICAgICAKICByZXR1cm4gMDsKfQo=