#include <iostream>
class bst_t
{
private:
struct node_t
{
node_t * left;
node_t * right;
int value;
};
node_t * root_;
static void insert_node(node_t * & node, int value)
{
auto current_pointer = &node;
while (true)
{
auto & current = *current_pointer;
if (current == nullptr)
{
current = new node_t{nullptr, nullptr, value};
return;
}
if (value < current->value) current_pointer = ¤t->left;
else if (current->value < value) current_pointer = ¤t->right;
else return;
}
}
template<typename Functor>
static void iterate_node(node_t * node, Functor functor)
{
if (node == nullptr) return;
iterate_node(node->left, functor);
functor(node->value);
iterate_node(node->right, functor);
}
static void delete_node(node_t * node)
{
if (node == nullptr) return;
delete_node(node->left);
delete_node(node->right);
delete node;
}
public:
bst_t()
:
root_{nullptr}
{}
~bst_t()
{
delete_node(root_);
}
void insert(int value)
{
insert_node(root_, value);
}
template<typename Functor>
void iterate(Functor functor)
{
iterate_node(root_, functor);
}
};
int main()
{
bst_t bst;
bst.insert(10);
bst.insert(20);
bst.insert(5);
bst.insert(15);
bst.insert(30);
bst.iterate([](int i)
{
std::cout << i << "\n";
});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgYnN0X3QKewpwcml2YXRlOgoJc3RydWN0IG5vZGVfdAoJewoJCW5vZGVfdCAqIGxlZnQ7CgkJbm9kZV90ICogcmlnaHQ7CgkJaW50IHZhbHVlOwoJfTsKCglub2RlX3QgKiByb290XzsKCglzdGF0aWMgdm9pZCBpbnNlcnRfbm9kZShub2RlX3QgKiAmIG5vZGUsIGludCB2YWx1ZSkKCXsKCQlhdXRvIGN1cnJlbnRfcG9pbnRlciA9ICZub2RlOwoKCQl3aGlsZSAodHJ1ZSkKCQl7CgkJCWF1dG8gJiBjdXJyZW50ID0gKmN1cnJlbnRfcG9pbnRlcjsKCgkJCWlmIChjdXJyZW50ID09IG51bGxwdHIpCgkJCXsKCQkJCWN1cnJlbnQgPSBuZXcgbm9kZV90e251bGxwdHIsIG51bGxwdHIsIHZhbHVlfTsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKHZhbHVlIDwgY3VycmVudC0+dmFsdWUpIGN1cnJlbnRfcG9pbnRlciA9ICZjdXJyZW50LT5sZWZ0OwoJCQllbHNlIGlmIChjdXJyZW50LT52YWx1ZSA8IHZhbHVlKSBjdXJyZW50X3BvaW50ZXIgPSAmY3VycmVudC0+cmlnaHQ7CgkJCWVsc2UgcmV0dXJuOwoJCX0KCX0KCgl0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jdG9yPgoJc3RhdGljIHZvaWQgaXRlcmF0ZV9ub2RlKG5vZGVfdCAqIG5vZGUsIEZ1bmN0b3IgZnVuY3RvcikKCXsKCQlpZiAobm9kZSA9PSBudWxscHRyKSByZXR1cm47CgoJCWl0ZXJhdGVfbm9kZShub2RlLT5sZWZ0LCBmdW5jdG9yKTsKCQlmdW5jdG9yKG5vZGUtPnZhbHVlKTsKCQlpdGVyYXRlX25vZGUobm9kZS0+cmlnaHQsIGZ1bmN0b3IpOwoJfQoKCXN0YXRpYyB2b2lkIGRlbGV0ZV9ub2RlKG5vZGVfdCAqIG5vZGUpCgl7CgkJaWYgKG5vZGUgPT0gbnVsbHB0cikgcmV0dXJuOwoKCQlkZWxldGVfbm9kZShub2RlLT5sZWZ0KTsKCQlkZWxldGVfbm9kZShub2RlLT5yaWdodCk7CgkJZGVsZXRlIG5vZGU7Cgl9CgpwdWJsaWM6Cglic3RfdCgpCgk6CgkJcm9vdF97bnVsbHB0cn0KCXt9CgoJfmJzdF90KCkKCXsKCQlkZWxldGVfbm9kZShyb290Xyk7Cgl9CgoJdm9pZCBpbnNlcnQoaW50IHZhbHVlKQoJewoJCWluc2VydF9ub2RlKHJvb3RfLCB2YWx1ZSk7Cgl9CgoJdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KCXZvaWQgaXRlcmF0ZShGdW5jdG9yIGZ1bmN0b3IpCgl7CgkJaXRlcmF0ZV9ub2RlKHJvb3RfLCBmdW5jdG9yKTsKCX0KfTsKCmludCBtYWluKCkKewoJYnN0X3QgYnN0OwoJYnN0Lmluc2VydCgxMCk7Cglic3QuaW5zZXJ0KDIwKTsKCWJzdC5pbnNlcnQoNSk7Cglic3QuaW5zZXJ0KDE1KTsKCWJzdC5pbnNlcnQoMzApOwoKCWJzdC5pdGVyYXRlKFtdKGludCBpKQoJewoJCXN0ZDo6Y291dCA8PCBpIDw8ICJcbiI7Cgl9KTsKfQ==