Ето една примерна реализация на дърво чрез структура:
#include <cstdlib> #include <iostream> using namespace std; // структура, която съхранява данните за един елемент struct tree { int value; tree* parent; tree* left; tree* right; }; // добавя елемент в дървото void insert_tree(tree* &t, int value, tree* parent) { tree* p; // ако добавяме на върха на дървото if (t == NULL) { p = new tree; p->left = p->right = NULL; p->parent = parent; p->value = value; t = p; } // добавяне в съответното поддърво else if (value < t->value) insert_tree(t->left, value, t); else insert_tree(t->right, value, t); } // търсене на стойност в дървото tree* search_tree(tree* t, int i) { // ако няма дърво, няма какво да търсиме if (t == NULL) return NULL; // ако сме попаднали на точният елемент - също if (t->value == i) return t; // търсим в съответното поддърво if (i < t->value) { return search_tree(t->left, i); } else { return search_tree(t->right, i); } } // намиране на най-малка стойност tree* find_min(tree* t) { // ако няма дърво, няма какво да търсиме if (t == NULL) return NULL; // намираме най-левия елемент tree *min = t; while (min->left != NULL) { min = min->left; } return min; } // изтриване на елемент void delete_element(tree* &t, int value) { // ако няма дърво, няма какво да изтриваме if (t == NULL) return; // намираме каквото ни трябва tree* element = search_tree(t, value); // ако няма такъв елемент, до тук сме if (element == NULL) return; // проверка има ли родител int hasParent = element->parent != NULL; // проверка дали е ляв наследник int isLeft = hasParent && element->value < element->parent->value; // ако елемента няма деца е лесно - изчистваме само указателя при родителя if (element->left == NULL && element->right == NULL) { if (hasParent) { if (isLeft) { element->parent->left = NULL; } else { element->parent->right = NULL; } } delete element; } // има само наследници отляво, свързваме наследника с родителя else if (element->left != NULL && element->right == NULL) { element->left->parent = element->parent; if (hasParent) { if (isLeft) { element->parent->left = element->left; } else { element->parent->right = element->left; } } // наследника е новият корен на дървото else { t = element->left; } delete element; } // има само родител отдясно, свързваме наследника с родителя else if (element->left == NULL && element->right != NULL) { element->right->parent = element->parent; if (hasParent) { if (isLeft) { element->parent->left = element->right; } else { element->parent->right = element->right; } } // наследника е новият корен на дървото else { t = element->right; } delete element; } // ако има два наследника, намираме най-малкия в дясното поддърво else { tree* right_min = find_min(element->right); // нашият ще е със стойността му element->value = right_min->value; // изтриваме най-малкия отдясно delete_element(right_min, right_min->value); } } // обработка на възел при обхождане - в случая отпечатваме възела, // но може да е и произволна друга операция със стойността му void process_node(int value) { cout<<value<<' '; } // inorder обхождане на дърво – посещаване на лявото поддърво, корена и дясното поддърво. // при това обхождане стойностите са в нарастващ ред void traverse_tree_inorder(tree* t) { if (t == NULL) return; traverse_tree_inorder(t->left); process_node(t->value); traverse_tree_inorder(t->right); } // preorder обхождане на дърво – посещаване на корена, лявото поддърво и дясното поддърво. void traverse_tree_preorder(tree* t) { if (t == NULL) return; process_node(t->value); traverse_tree_preorder(t->left); traverse_tree_preorder(t->right); } // postorder обхождане на дърво – посещаване на лявото поддърво, дясното поддърво и корена. void traverse_tree_postorder(tree* t) { if (t == NULL) return; traverse_tree_postorder(t->left); traverse_tree_postorder(t->right); process_node(t->value); } int main() { // създаваме празно дърво tree* t = NULL; // добавяме елементи в него int n; cout<<"Vavedete broi na elementite: "; cin>>n; cout<<"Vavedete "<<n<<" chisla, koito da zapisha v darvoto: "; int value; for(int i=0; i<n; i++) { cin>>value; insert_tree(t, value, t); } // отпечатване на елементите cout<<"print inorder: "; traverse_tree_inorder(t); cout<<endl; cout<<"print preorder: "; traverse_tree_preorder(t); cout<<endl; cout<<"print postorder: "; traverse_tree_postorder(t); cout<<endl; // намиране на най-малка стойност tree* node = find_min(t); if(node) cout<<"Nai-malkata stoinonst e "<<node->value<<endl; // намиране на произволна стойност cout<<"Vavedete chislo, koeto da potarsia:"; cin>>value; node=search_tree(t, value); if(node) if(node->parent) cout<<"Namereno e, roditel mu e "<<node->parent->value<<endl; else cout<<"Namereno e, namira se v korena na darvoto"<<endl; else cout<<"Niama takava stoinost v darvoto"<<endl; // изтриване на произволна стойност cout<<"Vavedete chislo, koeto da iztriya:"; cin>>value; delete_element(t, value); // отпечатване на елементите cout<<"print inorder: "; traverse_tree_inorder(t); cout<<endl; cout<<"print preorder: "; traverse_tree_preorder(t); cout<<endl; cout<<"print postorder: "; traverse_tree_postorder(t); cout<<endl; return 0; }