
алгоритмы / Построение дерева
.doc#include <iostream.h>
#include <conio.h>
class tree
{
public:
struct node
{
int info;
node *left, *right;
};
node *pn;
/*создание нового узла*/
node * new_node (int x);
/*добавление узла к дереву*/
node * add_node(int x, node* pn);
/*обход дерева в симметричном порядке*/
void print_sim (node* pn);
/*удаление всего дерева*/
void del_tree(node*pn);
tree();
~tree();
} t;
main()
{
int mas[10] = {5, 4, 8, 2, 9, 6, 4, 1, 7, -2}, i;
for(i=0; i<10; i++) t.pn = t.add_node(mas[i], t.pn);
t.print_sim (t.pn);
getch(); return 0;
}
tree :: tree()
{
pn = NULL;
}
tree :: ~tree()
{
del_tree(pn);
}
node * tree :: new_node (int x)
{
node *ptr;
ptr = new node;
ptr->info = x;
ptr->left = ptr->right = NULL;
return ptr;
}
node * tree :: add_node(int x, node* pn)
{
node *ptr = pn;
//Если дерева не существует, то создаем его.
if (pn == NULL) return new_node (x);
//Если добавляемое значение меньше информационного поля узла, то
if (x < pn->info)
pn->left = add_node (x, pn->left);
//добавляем его в левое поддерево, иначе - в правое
else
pn->right = add_node (x, pn->right);
return ptr;
}
void tree :: print_sim (node* pn)
{
// Если левое поддерево существует,то обходим его.
if (pn->left)
print_sim (pn->left);
cout<<pn->info<<” ”;
// Попадаем в корень.
// Если существует правое поддерево, то обходим и его.
if (pn->right)
print_sim (pn->right);
}
void tree :: del_tree(node* pn)
{
//Если левое поддерево существует,удаляем его.
if (pn->left)
del_tree(pn->left);
//Если существует правое поддерево, его тоже удаляем.
if (pn->right)
del_tree(pn->right);
//Удаляем корень.
delete pn;
}