#include <iostream>
#include <cstdlib>
template<class T>
class tree {
struct node {
T val;
node* left;
node* right;
};
private:
node* tr;
size_t cnt;
public:
tree(void):tr(NULL), cnt(0){}
tree(const tree&);
~tree(){
clear();
}
public:
//вставка
bool insert(const T& val){
node* p = tr, *i = tr;
while(i != NULL){
p = i;
if(val < i->val)
i = i->left;
else if(val > i->val)
i = i->right;
else
return false;
}
node* n = new (std::nothrow) node();
if(n != NULL){
n->val = val;
n->left = n->right = NULL;
if(p == NULL)
tr = n;
else if(val < p->val)
p->left = n;
else
p->right = n;
++cnt;
}
return (n != NULL);
}
//сумма элементов(метод, который выводит сумму узлов дерева)
T get_sum(void) {
return __sum(tr);
}
//удаление всех
void clear(void){
__clear(tr);
tr = NULL;
cnt = 0;
}
private:
T __sum(const node* p){
if(p != NULL)
return p->val + __sum(p->left) + __sum(p->right);
return 0;
}
void __clear(node* p){
if(p != NULL){
if(p->left != NULL)
__clear(p->left);
if(p->right != NULL)
__clear(p->right);
delete p;
}
}
size_t getSize(void) const { return cnt; }
//...
};
int main(void){
tree<size_t> tr;
for(int i = 0; i < 30; ++i)
tr.insert((size_t)(rand() % 40));
std::cout << "sum: " << tr.get_sum() << std::endl;
tr.clear();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCgp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyB0cmVlIHsKCXN0cnVjdCBub2RlIHsKCQlUICAgICB2YWw7CgkJbm9kZSogbGVmdDsKCQlub2RlKiByaWdodDsKCX07CnByaXZhdGU6Cglub2RlKiAgdHI7CglzaXplX3QgY250OwpwdWJsaWM6Cgl0cmVlKHZvaWQpOnRyKE5VTEwpLCBjbnQoMCl7fQoJdHJlZShjb25zdCB0cmVlJik7Cgl+dHJlZSgpewoJCWNsZWFyKCk7Cgl9CnB1YmxpYzoKCgkvL9Cy0YHRgtCw0LLQutCwCglib29sIGluc2VydChjb25zdCBUJiB2YWwpewoJCW5vZGUqIHAgPSB0ciwgKmkgPSB0cjsKCQl3aGlsZShpICE9IE5VTEwpewoJCQlwID0gaTsKCQkJaWYodmFsIDwgaS0+dmFsKQoJCQkJaSA9IGktPmxlZnQ7CgkJCWVsc2UgaWYodmFsID4gaS0+dmFsKQoJCQkJaSA9IGktPnJpZ2h0OwoJCQllbHNlCgkJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlub2RlKiBuID0gbmV3IChzdGQ6Om5vdGhyb3cpIG5vZGUoKTsKCQlpZihuICE9IE5VTEwpewoJCQluLT52YWwgID0gdmFsOwoJCQluLT5sZWZ0ID0gbi0+cmlnaHQgPSBOVUxMOwoKCQkJaWYocCA9PSBOVUxMKQoJCQkJdHIgPSBuOwoJCQllbHNlIGlmKHZhbCA8IHAtPnZhbCkKCQkJCXAtPmxlZnQgID0gbjsKCQkJZWxzZQoJCQkJcC0+cmlnaHQgPSBuOwoJCQkrK2NudDsKCQl9CgkJcmV0dXJuIChuICE9IE5VTEwpOwoJfQoKCS8v0YHRg9C80LzQsCDRjdC70LXQvNC10L3RgtC+0LIo0LzQtdGC0L7QtCwg0LrQvtGC0L7RgNGL0Lkg0LLRi9Cy0L7QtNC40YIg0YHRg9C80LzRgyDRg9C30LvQvtCyINC00LXRgNC10LLQsCkKCVQgZ2V0X3N1bSh2b2lkKSB7CgkJcmV0dXJuIF9fc3VtKHRyKTsKCX0KCgkvL9GD0LTQsNC70LXQvdC40LUg0LLRgdC10YUKCXZvaWQgY2xlYXIodm9pZCl7CgkJX19jbGVhcih0cik7CgkJdHIgID0gTlVMTDsKCQljbnQgPSAwOwoJfQoKcHJpdmF0ZToKCglUIF9fc3VtKGNvbnN0IG5vZGUqIHApewoJCWlmKHAgIT0gTlVMTCkKCQkJcmV0dXJuIHAtPnZhbCArCV9fc3VtKHAtPmxlZnQpICsgX19zdW0ocC0+cmlnaHQpOwoJCXJldHVybiAwOwoJfQoKCXZvaWQgX19jbGVhcihub2RlKiBwKXsKCQlpZihwICE9IE5VTEwpewoJCQlpZihwLT5sZWZ0ICE9IE5VTEwpCgkJCQlfX2NsZWFyKHAtPmxlZnQpOwoJCQlpZihwLT5yaWdodCAhPSBOVUxMKQoJCQkJX19jbGVhcihwLT5yaWdodCk7CgkJCWRlbGV0ZSBwOwoJCX0KCX0KCglzaXplX3QgZ2V0U2l6ZSh2b2lkKSBjb25zdCB7IHJldHVybiBjbnQ7IH0KCS8vLi4uCn07CgoKaW50IG1haW4odm9pZCl7Cgl0cmVlPHNpemVfdD4gdHI7Cglmb3IoaW50IGkgPSAwOyBpIDwgMzA7ICsraSkKCQl0ci5pbnNlcnQoKHNpemVfdCkocmFuZCgpICUgNDApKTsKCglzdGQ6OmNvdXQgPDwgInN1bTogIiA8PCB0ci5nZXRfc3VtKCkgPDwgc3RkOjplbmRsOwoJdHIuY2xlYXIoKTsKCXJldHVybiAwOwp9Cg==