Ильницкий В.Г.

Старший преподаватель кафедры программного обеспечения

Костанайского государственного университета им.А.Байтурсынова. Казахстан

 

Сортировка данных с использованием бинарного дерева

 

При работе с бинарными деревьями поиска, поиск и обход всех элементов дерева осуществляется намного быстрее, чем в массиве или линейном списке. При симметричном обходе дерева поиска данные выводятся в отсортированном порядке. Это свойство можно использовать для быстрой сортировки данных. Сначала при вводе данных строим дерево поиска, затем обходим все его элементы применяя симметричный обход. Программа выглядит следующим образом:

 

Сначала прописываем структуру, содержащую описание элемента дерева.

 

struct tre {

                int val;

                tre *l,*r;

                };

 

Задаем первоначальное значение вершины дерева как NULL

 

 tre *mytop=NULL;

 

При вводе очередных данных обращаемся к процедуре void searchtree(tre **t,int x), которая сначала ищет место для соответствующего элемента, затем вставляет его.

 

void searchtree(tre **t,int x) {

     if ((*t)==NULL) {(*t)=new tre; (*t)->r=(*t)->l=NULL; (*t)->val=x; return;}

     if  (x>(*t)->val) {searchtree(&(*t)->r, x);} else {searchtree(&(*t)->l, x);};

}

 

И наконец процедура void obxod(tre *t) осуществляет симметричный обход дерева поиска, выводя данные в отсортированном порядке.

 

void obxod(tre *t) {

     if (t->l!=NULL) obxod(t->l);

     Form1->Label1->Caption=Form1->Label1->Caption+"   "+t->val;

     if (t->r!=NULL) obxod(t->r);

}

 

Можно так-же применить еще одну процедуру void ris(tre *t,int aa,int bb, int y), которая при вводе данных для наглядности рисует на форме дерево, что облегчает понимание данного метода.

 

void ris(tre *t,int aa,int bb, int y) {

     if (t->l!=NULL) ris(t->l,aa,(aa+bb)/2,y+30);

     Form1->Image1->Canvas->TextOutA((aa+bb)/2,y,t->val);

     if (t->r!=NULL) ris(t->r,(aa+bb)/2,bb,y+30);

}

 

 

Литература:

1.А.Я. Архангельский «Язык С++ в С++ Builder»:БХВ – Петербург, 2002.

2. http://www.cyberforum.ru/cpp-beginners/thread117835.html

3. http://ci-plus-plus-snachala.ru/?p=89