#include <iostream>
#include <string>
//примитивный итератор для симметричного обхода двоичного дерева поиска
template<typename N, typename T>
struct itraverse {
private:
N* p;
public:
itraverse(void):p(NULL){}
itraverse(N* _p):p(_p){}
public:
bool operator != (N* _p) const { return (p != _p); }
bool operator == (N* _p) const { return (p == _p); }
T& operator *(void) const { return p->val; }
T& operator *(void) { return p->val; }
itraverse& operator ++ (void){
N* t;
if(p != NULL){
if(p->right == NULL){
t = p->parent;
while((t != NULL) && (p == t->right)){
p = t;
t = t->parent;
}
} else {
t = p->right;
while(t->left != NULL)
t = t->left;
}
p = t;
}
return *this;
}
itraverse operator ++ (int){
itraverse t(*this);
++*this;
return t;
}
};
//двоичное дерево поиска
template<typename T>
class bstree {
struct node {
T val;
node* left;
node* right;
node* parent;
};
private:
node* tr;
size_t n;
public:
typedef itraverse<node, T> traverse;
bstree(void):tr(NULL), n(0){}
bstree(const bstree&);
~bstree(){
this->clear();
}
public:
//вставка
bool insert(const T& val){
node* p, *t, **r = &tr;
p = t = tr;
while(p != NULL){
t = p;
if(val < p->val){
r = &p->left;
p = p->left;
} else {
if(val == p->val)
return false;
r = &p->right;
p = p->right;
}
}
p = new (std::nothrow) node();
if(p != NULL){
p->left = p->right = NULL;
p->parent = t;
p->val = val;
*r = p;
++n;
}
return (p != NULL);
}
//удаление
void remove(const T& val){
node* t1, *t2, *p = tr;
while(p != NULL){
if(val < p->val)
p = p->left;
else {
if(val == p->val)
break;
p = p->right;
}
}
if(p == NULL)
return;
if((p->left == NULL) || (p->right == NULL))
t1 = p;
else {
t1 = p->right;
while(t1->left != NULL)
t1 = t1->left;
}
t2 = (t1->left == NULL) ? t1->right : t1->left;
if(t2 != NULL)
t2->parent = t1->parent;
if(t1->parent == NULL)
tr = t2;
else if(t1 == t1->parent->left)
t1->parent->left = t2;
else
t1->parent->right = t2;
if(t1 != p)
p->val = t1->val;
delete t1;
--n;
}
//начало для прохода
node* begin(void){
node* p = tr;
if(p != NULL){
while(p->left != NULL)
p = p->left;
}
return p;
}
//кол-во элементов
size_t size(void) const {
return n;
}
//удаление всего дерева
void clear(void){
_clear(tr);
tr = NULL;
n = 0;
}
private:
void _clear(node* p){
if(p != NULL){
if(p->left != NULL)
_clear(p->left);
if(p->right != NULL)
_clear(p->right);
delete p;
}
}
};
int main(void){
bstree<std::string> tr;
tr.insert("for");
tr.insert("case");
tr.insert("while");
tr.insert("class");
tr.insert("protected");
tr.insert("virtual");
tr.insert("public");
tr.insert("private");
tr.insert("do");
tr.insert("template");
tr.insert("const");
tr.insert("if");
tr.insert("int");
bstree<std::string>::traverse p = tr.begin();
while(p != NULL){
std::cout << *p << std::endl;
++p;
}
tr.clear();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKLy/Qv9GA0LjQvNC40YLQuNCy0L3Ri9C5INC40YLQtdGA0LDRgtC+0YAg0LTQu9GPINGB0LjQvNC80LXRgtGA0LjRh9C90L7Qs9C+INC+0LHRhdC+0LTQsCDQtNCy0L7QuNGH0L3QvtCz0L4g0LTQtdGA0LXQstCwINC/0L7QuNGB0LrQsAp0ZW1wbGF0ZTx0eXBlbmFtZSBOLCB0eXBlbmFtZSBUPgpzdHJ1Y3QgaXRyYXZlcnNlIHsKcHJpdmF0ZToKCU4qIHA7CnB1YmxpYzoKCWl0cmF2ZXJzZSh2b2lkKTpwKE5VTEwpe30KCWl0cmF2ZXJzZShOKiBfcCk6cChfcCl7fQpwdWJsaWM6Cglib29sIG9wZXJhdG9yICE9IChOKiBfcCkgY29uc3QgeyByZXR1cm4gKHAgIT0gX3ApOyB9Cglib29sIG9wZXJhdG9yID09IChOKiBfcCkgY29uc3QgeyByZXR1cm4gKHAgPT0gX3ApOyB9CgoJVCYgb3BlcmF0b3IgKih2b2lkKSBjb25zdCB7IHJldHVybiBwLT52YWw7IH0KCVQmIG9wZXJhdG9yICoodm9pZCkgeyByZXR1cm4gcC0+dmFsOyB9CgoJaXRyYXZlcnNlJiBvcGVyYXRvciArKyAodm9pZCl7CgkJTiogdDsKCQlpZihwICE9IE5VTEwpewoJCQlpZihwLT5yaWdodCA9PSBOVUxMKXsKCQkJCXQgPSBwLT5wYXJlbnQ7CgkJCQl3aGlsZSgodCAhPSBOVUxMKSAmJiAocCA9PSB0LT5yaWdodCkpewoJCQkJCXAgPSB0OwoJCQkJCXQgPSB0LT5wYXJlbnQ7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQl0ID0gcC0+cmlnaHQ7CgkJCQl3aGlsZSh0LT5sZWZ0ICE9IE5VTEwpCgkJCQkJdCA9IHQtPmxlZnQ7CgkJCX0KCQkJcCA9IHQ7CgkJfQoJCXJldHVybiAqdGhpczsKCX0KCglpdHJhdmVyc2Ugb3BlcmF0b3IgKysgKGludCl7CgkJaXRyYXZlcnNlIHQoKnRoaXMpOwoJCSsrKnRoaXM7CgkJcmV0dXJuIHQ7Cgl9Cn07CgoKLy/QtNCy0L7QuNGH0L3QvtC1INC00LXRgNC10LLQviDQv9C+0LjRgdC60LAKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgYnN0cmVlIHsKCXN0cnVjdCBub2RlIHsKCQlUICAgICB2YWw7CgkJbm9kZSogbGVmdDsKCQlub2RlKiByaWdodDsKCQlub2RlKiBwYXJlbnQ7Cgl9Owpwcml2YXRlOgoJbm9kZSogIHRyOwoJc2l6ZV90IG47CnB1YmxpYzoKCXR5cGVkZWYgaXRyYXZlcnNlPG5vZGUsIFQ+IHRyYXZlcnNlOwoKCWJzdHJlZSh2b2lkKTp0cihOVUxMKSwgbigwKXt9Cglic3RyZWUoY29uc3QgYnN0cmVlJik7Cgl+YnN0cmVlKCl7CgkJdGhpcy0+Y2xlYXIoKTsKCX0KCnB1YmxpYzoKCgkvL9Cy0YHRgtCw0LLQutCwCglib29sIGluc2VydChjb25zdCBUJiB2YWwpewoJCW5vZGUqIHAsICp0LCAqKnIgPSAmdHI7CgoJCXAgPSB0ID0gdHI7CgkJd2hpbGUocCAhPSBOVUxMKXsKCQkJdCA9IHA7CgkJCWlmKHZhbCA8IHAtPnZhbCl7CgkJCQlyID0gJnAtPmxlZnQ7CgkJCQlwID0gIHAtPmxlZnQ7CgkJCX0gZWxzZSB7IAoJCQkJaWYodmFsID09IHAtPnZhbCkKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQlyID0gJnAtPnJpZ2h0OwoJCQkJcCA9IHAtPnJpZ2h0OwoJCQl9CgkJfQoKCQlwID0gbmV3IChzdGQ6Om5vdGhyb3cpIG5vZGUoKTsKCQlpZihwICE9IE5VTEwpewoJCQlwLT5sZWZ0ICAgPSBwLT5yaWdodCA9IE5VTEw7CgkJCXAtPnBhcmVudCA9IHQ7CgkJCXAtPnZhbCAgICA9IHZhbDsKCQkJKnIgPSBwOwoJCQkrK247CgkJfQoJCXJldHVybiAocCAhPSBOVUxMKTsKCX0KCgkvL9GD0LTQsNC70LXQvdC40LUKCXZvaWQgcmVtb3ZlKGNvbnN0IFQmIHZhbCl7CgkJbm9kZSogdDEsICp0MiwgKnAgPSB0cjsKCgkJd2hpbGUocCAhPSBOVUxMKXsKCQkJaWYodmFsIDwgcC0+dmFsKQoJCQkJcCA9IHAtPmxlZnQ7CgkJCWVsc2UgewoJCQkJaWYodmFsID09IHAtPnZhbCkKCQkJCQlicmVhazsKCQkJCXAgPSBwLT5yaWdodDsKCQkJfQoJCX0KCgkJaWYocCA9PSBOVUxMKQoJCQlyZXR1cm47CgoJCWlmKChwLT5sZWZ0ID09IE5VTEwpIHx8IChwLT5yaWdodCA9PSBOVUxMKSkKCQkJdDEgPSBwOwoJCWVsc2UgewoJCQl0MSA9IHAtPnJpZ2h0OyAKCQkJd2hpbGUodDEtPmxlZnQgIT0gTlVMTCkKCQkJCXQxID0gdDEtPmxlZnQ7CgkJfQoKCQl0MiA9ICh0MS0+bGVmdCA9PSBOVUxMKSA/ICB0MS0+cmlnaHQgOiB0MS0+bGVmdDsKCQlpZih0MiAhPSBOVUxMKQoJCQl0Mi0+cGFyZW50ID0gdDEtPnBhcmVudDsKCgkJaWYodDEtPnBhcmVudCA9PSBOVUxMKQoJCQl0ciA9IHQyOwoJCWVsc2UgaWYodDEgPT0gdDEtPnBhcmVudC0+bGVmdCkKCQkJdDEtPnBhcmVudC0+bGVmdCAgPSB0MjsKCQllbHNlCgkJCXQxLT5wYXJlbnQtPnJpZ2h0ID0gdDI7CgoJCWlmKHQxICE9IHApCgkJCXAtPnZhbCA9IHQxLT52YWw7CgoJCWRlbGV0ZSB0MTsKCQktLW47Cgl9CgoJLy/QvdCw0YfQsNC70L4g0LTQu9GPINC/0YDQvtGF0L7QtNCwCglub2RlKiBiZWdpbih2b2lkKXsKCQlub2RlKiBwID0gdHI7CgkJaWYocCAhPSBOVUxMKXsKCQkJd2hpbGUocC0+bGVmdCAhPSBOVUxMKQoJCQkJcCA9IHAtPmxlZnQ7CgkJfQoJCXJldHVybiBwOwoJfQoKCS8v0LrQvtC7LdCy0L4g0Y3Qu9C10LzQtdC90YLQvtCyCglzaXplX3Qgc2l6ZSh2b2lkKSBjb25zdCB7CgkJcmV0dXJuIG47Cgl9CgoJLy/Rg9C00LDQu9C10L3QuNC1INCy0YHQtdCz0L4g0LTQtdGA0LXQstCwCgl2b2lkIGNsZWFyKHZvaWQpewoJCV9jbGVhcih0cik7CgkJdHIgPSBOVUxMOwoJCW4gID0gMDsKCX0KCnByaXZhdGU6CgoJdm9pZCBfY2xlYXIobm9kZSogcCl7CgkJaWYocCAhPSBOVUxMKXsKCQkJaWYocC0+bGVmdCAhPSBOVUxMKQoJCQkJX2NsZWFyKHAtPmxlZnQpOwoJCQlpZihwLT5yaWdodCAhPSBOVUxMKQoJCQkJX2NsZWFyKHAtPnJpZ2h0KTsKCQkJZGVsZXRlIHA7CgkJfQoJfQp9OwoKCmludCBtYWluKHZvaWQpewoJYnN0cmVlPHN0ZDo6c3RyaW5nPiB0cjsKCgl0ci5pbnNlcnQoImZvciIpOwoJdHIuaW5zZXJ0KCJjYXNlIik7Cgl0ci5pbnNlcnQoIndoaWxlIik7Cgl0ci5pbnNlcnQoImNsYXNzIik7Cgl0ci5pbnNlcnQoInByb3RlY3RlZCIpOwoJdHIuaW5zZXJ0KCJ2aXJ0dWFsIik7Cgl0ci5pbnNlcnQoInB1YmxpYyIpOwoJdHIuaW5zZXJ0KCJwcml2YXRlIik7Cgl0ci5pbnNlcnQoImRvIik7Cgl0ci5pbnNlcnQoInRlbXBsYXRlIik7Cgl0ci5pbnNlcnQoImNvbnN0Iik7Cgl0ci5pbnNlcnQoImlmIik7Cgl0ci5pbnNlcnQoImludCIpOwoKCWJzdHJlZTxzdGQ6OnN0cmluZz46OnRyYXZlcnNlIHAgPSB0ci5iZWdpbigpOwoJd2hpbGUocCAhPSBOVUxMKXsKCQlzdGQ6OmNvdXQgPDwgKnAgPDwgc3RkOjplbmRsOwoJCSsrcDsKCX0KCXRyLmNsZWFyKCk7CglyZXR1cm4gMDsKfQoKCg==