Схема алгоритма для сьаласировка бинарного дерева.

ОПИСАНИЕ АЛГОРИТМА

  • сбалансированное бинарное дерево поиска.

Идеально сбалансированным назовем такое бинарное дерево T , что для каждого его узлаxсправедливо соотношение

|nL(x) - nR(x)| £ 1,

где nL(x) - количество узлов в левом поддереве узлаx, а nR(x) - количество узлов в правом поддеревеузлаx.

В идеально сбалансированном дереве число узлов n

и высота дерева h связаны соотношением

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru или h= Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

Высота дерева определена так, что при n = 0 имеем h = 0, а при n = 1 имеем h = 1

Пусть, например, данные берутся из потока infile.

a,b,c,d,e,f,g,h,I.

Идея (рекурсивного) алгоритма

Здесь nэто количество элементов в файле.

nL это количество элементов на левой части после того как мы разделили количесво элементов пополам.

nR это количество элементов на правой части после того как мы разделили количесво элементов пополам.

Дальше мы разделим количесво элементов на левой и правой частей пополам,и продолжаем этот процесс до тех пор n !=0.тот элемента в середине становится главным элементом поддерева или дерева,как показано вниз.

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a,b,c,d,e,f,g,h,i. (n=9)

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a,b,c,d,(n=4)f,g,h,i.(n=4)

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a,b(n=2)d (n=1)f,g,(n=2)i(n=1)

a(n=1)f (n=1)

(здесьnL = n/2 иnR = n– nL – 1, т. е. n = nL + nR +1)

Всеэлементывфайлерасположеныпо возразтанию.

  • Операция поиска заданного элемента x: base

в непустом БДП b: BSTree производится рекурсивно :

Если k(x) = k(b), то элемент x находится в корне дерева b. Поиск закончен «успешно» – элемент найден.

Если k(x) < k(b), то продолжить поиск в левом поддереве Left (b).

Если k(x) > k(b), то продолжить поиск в правом поддереве Right (b).

Если выбранное поддерево оказывается пустым, то поиск завершается «неудачно» – элемента x в дереве b нет.

Пример:

У нас такое сбалансированное бинарное дерево поиска.

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru E

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru CH

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru BDGI

AF

Сейчас мы пытаемся найти элемент Gв сбалансированномбинарном дереве поиска.

мы проверяем, если G равен первому элементу. Первый элемент это E они не равны. Дальше рассмотриваем если Gбольше или меньше.здесь видно что Gбольше поэтому мы продолжаем поиск в правом поддереве. Потом встречаем новый элемент H. Gменьше этого элемент из-за этого продолжаем поиск в левом поддереве.проверяем если они равны,получается что они равны тогда рекурсия заканчивается и возврашаем TRUE.

  • Случайные бинарные деревья поиск .

Случайные бинарные деревья поиск построится из входной последовательности (например из файла (d,b,h,a,c,f,k))

Первый элемент всегда становится перым узлом дерева. Остальные построенны по принципу указано вниз:

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

Например :(d,b,h,a,c)

d–это первы элемент.

bэто второй элемент,сейчас сравниваем второй элемент с первом,так как второй меньше первого мы продолжаем сравнение на левой части первого .так что у нас больше нет элементов на левой части первого элемента мы построим узел второго элемента на левой части первого элемента.его представление

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

b

дальше,третий элемент это h.сейчас сравниваем третий элемент с первом,так как третий больше первого мы продолжаем сравнение на правой части первого . так что у нас больше нет элементов на правой части первого элемента мы построим узел третего элемента на левой части первого элемента.так Выглядит

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

bh

дальше,чертвёртий элемент это a.сейчас сравниваем чертвёртий элемент с первом,так как чертвёртий меньше первого мы продолжаем сравнение на левой части первого,дальше мы встречаем ещё элемент (b) на левой части первого элемента и сравниваем,так как чертвёртий элемент (а) меньше (b)мы продолжаем сравнение на левой части этого элемента .так что у нас больше нет элементов на левой части этого элемента мы построим узел четвёртого элемента на левой части этого элемента.его представление

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru bh

а

дальше,пятый элемент это с.сейчас сравниваем пятый элемент с первом,так как пятый меньше первого мы продолжаем сравнение на левой части первого,дальше мы встречаем ещё элемент (b) на левой части первого элемента и сравниваем,так как пятый элемент (с) больше(b)мы продолжаем сравнение на правой части этого элемента .так что у нас больше нет элементов на правой части этого элемента мы построим узел пятого элемента на правой части этого элемента.его представление

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru bh

а с

  • Случайные бинарные деревья поиск .

Ø Вставка в корень БДП

В некоторых случаях полезно при добавлении нового узла сделать так, чтобы этот узел стал корнем БДП.

  1. Построенные таким образом БДП имеют некоторые полезные свойства.
  2. Операция вставки в корень будет использоваться в модификации случайных БДП, рассмотренной далее.

Рекурсивный способ

1. Если вставляемый элемент больше корня БДП,то его место в правом поддереве. Поэтому сначала рекурсивно вставим этот элемент в качестве корня правого поддерева, а затем с помощью левого вращения поднимем его в корень дерева.

2. Есливставляемый элемент меньше корня БДП,то его место в левом поддереве. Поэтому сначала рекурсивно вставим этот элемент в качестве корня левого поддерева, а затем с помощью правого вращения поднимем его в корень дерева.

Пример:

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

a c f k

при добавлении элмента e,

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru e

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

a c f k

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru после добавления элемента в правильном месте:

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a c f k

e

с помощью правого и левого вращения подмем элмемент е в корень дерева:

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a c f k

e

после правого врашения

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a c е k

f

после правого врашения

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b e

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a c h

f k

после левого врашения

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru е

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d h

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b f k

a ` c

КОД:

Btree.h

// интерфейсАТД "Бинарноедерево"(впроцедурно-модульнойпарадигме)

namespacebinTree_modul

{

//-------------------------------------

typedefchar base;

struct node {

base info;

node *lt;

node *rt;

int count;

// constructor

node () {

lt = NULL; rt = NULL;

count=0;

}

};

typedefnode *binTree; // "представитель" бинарного дерева

binTree Create(void);

boolisNull(binTree);

baseRootBT (binTree); // длянепустогобин.дерева

binTree Left (binTree);// длянепустогобин.дерева

binTree Right (binTree);// длянепустогобин.дерева

binTreeConsBT(const base &x, binTree&lst, binTree&rst);

void destroy (binTree&);

}

bt_implementation.cpp

// Implementation - Реализация АТД "Бинарное дерево" (в процедурно-модульной парадигме)

#include<iostream>

#include<cstdlib>

#include"Btree.h"

usingnamespacestd ;

namespacebinTree_modul

{

//-------------------------------------

binTree Create()

{ return NULL;

}

//-------------------------------------

boolisNull(binTree b)

{ return (b == NULL);

}

//-------------------------------------

baseRootBT (binTree b) // длянепустогобин.дерева

{ if (b == NULL) { cerr<<"Error: RootBT(null) \n"; exit(1); }

elsereturn b->info;

}

//-------------------------------------

binTree Left (binTree b) // длянепустогобин.дерева

{ if (b == NULL) { cerr<<"Error: Left(null) \n"; exit(1); }

elsereturn b ->lt;

}

//-------------------------------------

binTree Right (binTree b) // длянепустогобин.дерева

{ if (b == NULL) { cerr<<"Error: Right(null) \n"; exit(1); }

elsereturn b->rt;

}

//-------------------------------------

binTreeConsBT(const base &x, binTree&lst, binTree&rst)

{ binTree p;

p = new node;

if ( p != NULL) {

p ->info = x;

p ->lt = lst;

p ->rt = rst;

return p;

}

else {cerr<<"Memory not enough\n"; exit(1);}

}

//-------------------------------------

void destroy (binTree&b)

{ if (b != NULL) {

destroy (b->lt);

destroy (b->rt);

delete b;

b = NULL;

}

}

} // end of namespace h_list

idealBlnsTr.cpp

#include<iostream>

#include<fstream>

#include"time.h"

#include<cstdlib>

#include"Btree.h"

#include<windows.h>

usingnamespacestd ;

usingnamespacebinTree_modul;

typedefunsignedintunInt;

voidrotateL (binTree&t);

voidrotateR (binTree&t);

voidinsInRoot (binTree&b, base x);

bool Locate (base x, binTree b);

voidSearchAndInsert (base x, binTree&b);

voiddisplayBt (binTree b, int n);

unInthBT (binTree b);

unIntsizeBT (binTree b);

voiddisplayBt(binTreeq,intlevel,boolleft,bool *mas);

binTreemakeTree (unInt n);

ifstream infile2 ("inputf.txt");

ifstream infile3 ("inputf1.txt");

int main ()

{

restart:

system("cls");

binTree b;

SetConsoleCP(1251); // для вывода кирилицы

SetConsoleOutputCP(1251); // для вывода кирилицы

if (!infile2) cout<<"Входной файл #2 не открыт!"<<endl;

cout<<"Building a perfectly balanced binary tree "<<endl;

cout<<".................MENU..................\n";

cout<<"1)balanced Binary tree search\n2) Element search\n3)cluchainie binary tree search\n4)exit\n5)adding an element in the cluchainie binary tree search c pomoshiufctafki b koren \n";

char s;

cout<<"Enter your choice: \n";

cin>>s;

if(s=='5'|| s=='4'||s=='3'||s=='2'||s=='1'){

;

}else{

cout<<"Enter the right choice!!\n";

goto restart;

}

unInt n=9;

bool mas[1000];

memset(mas,0,1000);

bool p=true;

switch(s){

case'1':

clock_t start;

double duration;

start=clock();

b = makeTree (n);

displayBt(b,0,false,mas);

duration=(clock()-start)/(double)CLOCKS_PER_SEC;

cout<<"Time taken to create and print out the balanced tree: "<<duration<<endl;

cout<<"tree height = "<<hBT(b) <<endl;

cout<<"Size (number of nodes) of the tree = "<<sizeBT(b) <<endl;

//destroy (b);

break;

case'2':

b=makeTree(n);

displayBt(b,0,false,mas);

base x;

cout<<"Enter the elment you are searchin for: \n";

cin>>x;

base r;

double duration1;

clock_t start1;

start1=clock();

p=Locate(x,b);

duration1=(clock()-start1)/(double)CLOCKS_PER_SEC;

cout<<"Time taken to find the elmenet in the balanced tree: "<<duration1<<endl;

if (p){

cout<<"The Element was found!!\n";

}

else{cout<<"Elemnet not found!!\n";

}

;

//destroy (b);

break;

case'4':

exit(0);

break;

case'3':

b=NULL;

base y;

clock_t start2;

double duration2;

start2=clock();

while(infile3>>y){

SearchAndInsert (y,b);

}

displayBt(b,0,false,mas);

duration2=(clock()-start2)/(double)CLOCKS_PER_SEC;

cout<<"Time taken to create cluchainie binary tree and print: "<<duration2<<endl;

break;

case'5':

b=NULL;

clock_t start3;

double duration3;

start3=clock();

while(infile3>>y){

SearchAndInsert (y,b);

}

displayBt(b,0,false,mas);

base g;

cout<<"Enter the element you want to add to the tree: \n";

cin>>g;

insInRoot (b,g);

displayBt(b,0,false,mas);

duration3=(clock()-start3)/(double)CLOCKS_PER_SEC;

cout<<"Time taken to Add element to cluchainie binary tree c pomoshiufctafki b koren and print: "<<duration3<<endl;

break;

default:

break;

}

destroy(b);

system("pause");

}

//---------------------------------------

unInthBT (binTree b)

{

if (isNull(b)) return 0;

elsereturn max (hBT (Left(b)), hBT(Right(b))) + 1;

}

//---------------------------------------

unIntsizeBT (binTree b)

{

if (isNull(b)) return 0;

elsereturnsizeBT (Left(b))+ sizeBT(Right(b)) + 1;

}

//---------------------------------------

binTreemakeTree (unIntn)

// построение идеально сбалансированного дерева

{

unIntnL, nR;

binTree b1, b2;

base x;

if (n==0){

return Create();

}

nL = n/2;

nR = n-nL-1;

b1 = makeTree (nL);

infile2 >> x;

b2 = makeTree (nR);

returnConsBT(x, b1, b2);

}

bool Locate (base x, binTree b)

// b – должно быть БДП

{ baser;

if (isNull(b)) returnfalse;

else {

r = RootBT(b);

if (x==r) returntrue;

elseif (x<r) return Locate(x,Left(b));

elsereturn Locate(x,Right(b));

}

}

voiddisplayBt(binTreeq,intlevel,boolleft,bool *mas)

{

if(q!=0)

{

for(inti=1;i<level*4;i++)

{

if(mas[i]){

cout<< (char)179;

}

else{

cout<<" ";

}

}

if(q->lt!=0||q->rt!=0)

if(level!=0)

{

if(left)

{

cout<<(char)192<<"["<<q->info<<"]"<<(char)191;

mas[level*4]=false;

}

else

{

cout<<(char)195<<"["<<q->info<<"]"<<(char)191;

mas[level*4]=true;

}

}

else

{

cout<<"["<<q->info<<"]"<<(char)191;

}

else

{

if(left)

cout<<(char)192<<"["<< q->info<<"]";

else

cout<<(char)195<<"["<< q->info<<"]";

}

cout<<endl;

displayBt(q->rt,level+1,false,mas);

displayBt(q->lt,level+1,true,mas);

}

}

voidSearchAndInsert (base x, binTree&b)

{ if (b==NULL) {

b = new node;

b ->info = x;

b ->count = 1;

}

elseif(x < b->info) SearchAndInsert (x, b->lt);

elseif(x > b->info) SearchAndInsert (x, b->rt);

else b->count++;

}

voidrotateR (binTree&t)

//b - непусто

{ binTree x;

if (t==NULL){cout<< "rotateR(NULL)"<<endl; }

else {

x = t->lt;

t->lt = x->rt;

x->rt = t;

t =x;

}

}

voidrotateL (binTree&t)

//b - непусто

{ binTreex;

if (t==NULL){

cout<< "rotateL(NULL)"<<endl; }

else {

x = t->rt;

t->rt = x->lt;

x->lt = t;

t =x;

}

}

voidinsInRoot (binTree&b, base x)

{ if (b==NULL) {

b = new node;

if ( b != NULL) {

b ->info = x;

b ->count = 1;

}

else {cerr<<"1 Memory not enough\n"; exit(1);}

} else

if (x < b->info) {insInRoot (b->lt, x); rotateR (b);}

elseif (x > b->info) {insInRoot (b->rt, x); rotateL (b);}

else b->count++;

}

Infile2:Acdefg

БЛОКСХЕМА :

Пример работы программы

ü Исходные данны из файла : a,b,c,d,e,f,g,h,i .

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

ü Исходные данны из файла : b,d,f,i ,j,m,r,t,w

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

ü Исходные данны из файла : dbhacfk

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

ü Исходные данны из файла : ropqcvn

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

ü Исходные данны из файла : jalzxbs

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

ü Исходные данны из файла : jalzxbs

При добавлении элемента k

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

Поиск элемента всбалансированномбинарном дереве поиска.

Мы ищем элемент “r” Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

ОПИСАНИЕ АЛГОРИТМА

  • сбалансированное бинарное дерево поиска.

Идеально сбалансированным назовем такое бинарное дерево T , что для каждого его узлаxсправедливо соотношение

|nL(x) - nR(x)| £ 1,

где nL(x) - количество узлов в левом поддереве узлаx, а nR(x) - количество узлов в правом поддеревеузлаx.

В идеально сбалансированном дереве число узлов n

и высота дерева h связаны соотношением

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru или h= Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

Высота дерева определена так, что при n = 0 имеем h = 0, а при n = 1 имеем h = 1

Пусть, например, данные берутся из потока infile.

a,b,c,d,e,f,g,h,I.

Идея (рекурсивного) алгоритма

Здесь nэто количество элементов в файле.

nL это количество элементов на левой части после того как мы разделили количесво элементов пополам.

nR это количество элементов на правой части после того как мы разделили количесво элементов пополам.

Дальше мы разделим количесво элементов на левой и правой частей пополам,и продолжаем этот процесс до тех пор n !=0.тот элемента в середине становится главным элементом поддерева или дерева,как показано вниз.

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a,b,c,d,e,f,g,h,i. (n=9)

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a,b,c,d,(n=4)f,g,h,i.(n=4)

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a,b(n=2)d (n=1)f,g,(n=2)i(n=1)

a(n=1)f (n=1)

(здесьnL = n/2 иnR = n– nL – 1, т. е. n = nL + nR +1)

Всеэлементывфайлерасположеныпо возразтанию.

  • Операция поиска заданного элемента x: base

в непустом БДП b: BSTree производится рекурсивно :

Если k(x) = k(b), то элемент x находится в корне дерева b. Поиск закончен «успешно» – элемент найден.

Если k(x) < k(b), то продолжить поиск в левом поддереве Left (b).

Если k(x) > k(b), то продолжить поиск в правом поддереве Right (b).

Если выбранное поддерево оказывается пустым, то поиск завершается «неудачно» – элемента x в дереве b нет.

Пример:

У нас такое сбалансированное бинарное дерево поиска.

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru E

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru CH

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru BDGI

AF

Сейчас мы пытаемся найти элемент Gв сбалансированномбинарном дереве поиска.

мы проверяем, если G равен первому элементу. Первый элемент это E они не равны. Дальше рассмотриваем если Gбольше или меньше.здесь видно что Gбольше поэтому мы продолжаем поиск в правом поддереве. Потом встречаем новый элемент H. Gменьше этого элемент из-за этого продолжаем поиск в левом поддереве.проверяем если они равны,получается что они равны тогда рекурсия заканчивается и возврашаем TRUE.

  • Случайные бинарные деревья поиск .

Случайные бинарные деревья поиск построится из входной последовательности (например из файла (d,b,h,a,c,f,k))

Первый элемент всегда становится перым узлом дерева. Остальные построенны по принципу указано вниз:

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

Например :(d,b,h,a,c)

d–это первы элемент.

bэто второй элемент,сейчас сравниваем второй элемент с первом,так как второй меньше первого мы продолжаем сравнение на левой части первого .так что у нас больше нет элементов на левой части первого элемента мы построим узел второго элемента на левой части первого элемента.его представление

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

b

дальше,третий элемент это h.сейчас сравниваем третий элемент с первом,так как третий больше первого мы продолжаем сравнение на правой части первого . так что у нас больше нет элементов на правой части первого элемента мы построим узел третего элемента на левой части первого элемента.так Выглядит

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

bh

дальше,чертвёртий элемент это a.сейчас сравниваем чертвёртий элемент с первом,так как чертвёртий меньше первого мы продолжаем сравнение на левой части первого,дальше мы встречаем ещё элемент (b) на левой части первого элемента и сравниваем,так как чертвёртий элемент (а) меньше (b)мы продолжаем сравнение на левой части этого элемента .так что у нас больше нет элементов на левой части этого элемента мы построим узел четвёртого элемента на левой части этого элемента.его представление

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru bh

а

дальше,пятый элемент это с.сейчас сравниваем пятый элемент с первом,так как пятый меньше первого мы продолжаем сравнение на левой части первого,дальше мы встречаем ещё элемент (b) на левой части первого элемента и сравниваем,так как пятый элемент (с) больше(b)мы продолжаем сравнение на правой части этого элемента .так что у нас больше нет элементов на правой части этого элемента мы построим узел пятого элемента на правой части этого элемента.его представление

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru bh

а с

  • Случайные бинарные деревья поиск .

Ø Вставка в корень БДП

В некоторых случаях полезно при добавлении нового узла сделать так, чтобы этот узел стал корнем БДП.

  1. Построенные таким образом БДП имеют некоторые полезные свойства.
  2. Операция вставки в корень будет использоваться в модификации случайных БДП, рассмотренной далее.

Рекурсивный способ

1. Если вставляемый элемент больше корня БДП,то его место в правом поддереве. Поэтому сначала рекурсивно вставим этот элемент в качестве корня правого поддерева, а затем с помощью левого вращения поднимем его в корень дерева.

2. Есливставляемый элемент меньше корня БДП,то его место в левом поддереве. Поэтому сначала рекурсивно вставим этот элемент в качестве корня левого поддерева, а затем с помощью правого вращения поднимем его в корень дерева.

Пример:

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

a c f k

при добавлении элмента e,

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru e

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

a c f k

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru после добавления элемента в правильном месте:

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a c f k

e

с помощью правого и левого вращения подмем элмемент е в корень дерева:

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a c f k

e

после правого врашения

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b h

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a c е k

f

после правого врашения

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b e

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru a c h

f k

после левого врашения

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru е

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru d h

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru Схема алгоритма для сьаласировка бинарного дерева. - student2.ru b f k

a ` c

КОД:

Btree.h

// интерфейсАТД "Бинарноедерево"(впроцедурно-модульнойпарадигме)

namespacebinTree_modul

{

//-------------------------------------

typedefchar base;

struct node {

base info;

node *lt;

node *rt;

int count;

// constructor

node () {

lt = NULL; rt = NULL;

count=0;

}

};

typedefnode *binTree; // "представитель" бинарного дерева

binTree Create(void);

boolisNull(binTree);

baseRootBT (binTree); // длянепустогобин.дерева

binTree Left (binTree);// длянепустогобин.дерева

binTree Right (binTree);// длянепустогобин.дерева

binTreeConsBT(const base &x, binTree&lst, binTree&rst);

void destroy (binTree&);

}

bt_implementation.cpp

// Implementation - Реализация АТД "Бинарное дерево" (в процедурно-модульной парадигме)

#include<iostream>

#include<cstdlib>

#include"Btree.h"

usingnamespacestd ;

namespacebinTree_modul

{

//-------------------------------------

binTree Create()

{ return NULL;

}

//-------------------------------------

boolisNull(binTree b)

{ return (b == NULL);

}

//-------------------------------------

baseRootBT (binTree b) // длянепустогобин.дерева

{ if (b == NULL) { cerr<<"Error: RootBT(null) \n"; exit(1); }

elsereturn b->info;

}

//-------------------------------------

binTree Left (binTree b) // длянепустогобин.дерева

{ if (b == NULL) { cerr<<"Error: Left(null) \n"; exit(1); }

elsereturn b ->lt;

}

//-------------------------------------

binTree Right (binTree b) // длянепустогобин.дерева

{ if (b == NULL) { cerr<<"Error: Right(null) \n"; exit(1); }

elsereturn b->rt;

}

//-------------------------------------

binTreeConsBT(const base &x, binTree&lst, binTree&rst)

{ binTree p;

p = new node;

if ( p != NULL) {

p ->info = x;

p ->lt = lst;

p ->rt = rst;

return p;

}

else {cerr<<"Memory not enough\n"; exit(1);}

}

//-------------------------------------

void destroy (binTree&b)

{ if (b != NULL) {

destroy (b->lt);

destroy (b->rt);

delete b;

b = NULL;

}

}

} // end of namespace h_list

idealBlnsTr.cpp

#include<iostream>

#include<fstream>

#include"time.h"

#include<cstdlib>

#include"Btree.h"

#include<windows.h>

usingnamespacestd ;

usingnamespacebinTree_modul;

typedefunsignedintunInt;

voidrotateL (binTree&t);

voidrotateR (binTree&t);

voidinsInRoot (binTree&b, base x);

bool Locate (base x, binTree b);

voidSearchAndInsert (base x, binTree&b);

voiddisplayBt (binTree b, int n);

unInthBT (binTree b);

unIntsizeBT (binTree b);

voiddisplayBt(binTreeq,intlevel,boolleft,bool *mas);

binTreemakeTree (unInt n);

ifstream infile2 ("inputf.txt");

ifstream infile3 ("inputf1.txt");

int main ()

{

restart:

system("cls");

binTree b;

SetConsoleCP(1251); // для вывода кирилицы

SetConsoleOutputCP(1251); // для вывода кирилицы

if (!infile2) cout<<"Входной файл #2 не открыт!"<<endl;

cout<<"Building a perfectly balanced binary tree "<<endl;

cout<<".................MENU..................\n";

cout<<"1)balanced Binary tree search\n2) Element search\n3)cluchainie binary tree search\n4)exit\n5)adding an element in the cluchainie binary tree search c pomoshiufctafki b koren \n";

char s;

cout<<"Enter your choice: \n";

cin>>s;

if(s=='5'|| s=='4'||s=='3'||s=='2'||s=='1'){

;

}else{

cout<<"Enter the right choice!!\n";

goto restart;

}

unInt n=9;

bool mas[1000];

memset(mas,0,1000);

bool p=true;

switch(s){

case'1':

clock_t start;

double duration;

start=clock();

b = makeTree (n);

displayBt(b,0,false,mas);

duration=(clock()-start)/(double)CLOCKS_PER_SEC;

cout<<"Time taken to create and print out the balanced tree: "<<duration<<endl;

cout<<"tree height = "<<hBT(b) <<endl;

cout<<"Size (number of nodes) of the tree = "<<sizeBT(b) <<endl;

//destroy (b);

break;

case'2':

b=makeTree(n);

displayBt(b,0,false,mas);

base x;

cout<<"Enter the elment you are searchin for: \n";

cin>>x;

base r;

double duration1;

clock_t start1;

start1=clock();

p=Locate(x,b);

duration1=(clock()-start1)/(double)CLOCKS_PER_SEC;

cout<<"Time taken to find the elmenet in the balanced tree: "<<duration1<<endl;

if (p){

cout<<"The Element was found!!\n";

}

else{cout<<"Elemnet not found!!\n";

}

;

//destroy (b);

break;

case'4':

exit(0);

break;

case'3':

b=NULL;

base y;

clock_t start2;

double duration2;

start2=clock();

while(infile3>>y){

SearchAndInsert (y,b);

}

displayBt(b,0,false,mas);

duration2=(clock()-start2)/(double)CLOCKS_PER_SEC;

cout<<"Time taken to create cluchainie binary tree and print: "<<duration2<<endl;

break;

case'5':

b=NULL;

clock_t start3;

double duration3;

start3=clock();

while(infile3>>y){

SearchAndInsert (y,b);

}

displayBt(b,0,false,mas);

base g;

cout<<"Enter the element you want to add to the tree: \n";

cin>>g;

insInRoot (b,g);

displayBt(b,0,false,mas);

duration3=(clock()-start3)/(double)CLOCKS_PER_SEC;

cout<<"Time taken to Add element to cluchainie binary tree c pomoshiufctafki b koren and print: "<<duration3<<endl;

break;

default:

break;

}

destroy(b);

system("pause");

}

//---------------------------------------

unInthBT (binTree b)

{

if (isNull(b)) return 0;

elsereturn max (hBT (Left(b)), hBT(Right(b))) + 1;

}

//---------------------------------------

unIntsizeBT (binTree b)

{

if (isNull(b)) return 0;

elsereturnsizeBT (Left(b))+ sizeBT(Right(b)) + 1;

}

//---------------------------------------

binTreemakeTree (unIntn)

// построение идеально сбалансированного дерева

{

unIntnL, nR;

binTree b1, b2;

base x;

if (n==0){

return Create();

}

nL = n/2;

nR = n-nL-1;

b1 = makeTree (nL);

infile2 >> x;

b2 = makeTree (nR);

returnConsBT(x, b1, b2);

}

bool Locate (base x, binTree b)

// b – должно быть БДП

{ baser;

if (isNull(b)) returnfalse;

else {

r = RootBT(b);

if (x==r) returntrue;

elseif (x<r) return Locate(x,Left(b));

elsereturn Locate(x,Right(b));

}

}

voiddisplayBt(binTreeq,intlevel,boolleft,bool *mas)

{

if(q!=0)

{

for(inti=1;i<level*4;i++)

{

if(mas[i]){

cout<< (char)179;

}

else{

cout<<" ";

}

}

if(q->lt!=0||q->rt!=0)

if(level!=0)

{

if(left)

{

cout<<(char)192<<"["<<q->info<<"]"<<(char)191;

mas[level*4]=false;

}

else

{

cout<<(char)195<<"["<<q->info<<"]"<<(char)191;

mas[level*4]=true;

}

}

else

{

cout<<"["<<q->info<<"]"<<(char)191;

}

else

{

if(left)

cout<<(char)192<<"["<< q->info<<"]";

else

cout<<(char)195<<"["<< q->info<<"]";

}

cout<<endl;

displayBt(q->rt,level+1,false,mas);

displayBt(q->lt,level+1,true,mas);

}

}

voidSearchAndInsert (base x, binTree&b)

{ if (b==NULL) {

b = new node;

b ->info = x;

b ->count = 1;

}

elseif(x < b->info) SearchAndInsert (x, b->lt);

elseif(x > b->info) SearchAndInsert (x, b->rt);

else b->count++;

}

voidrotateR (binTree&t)

//b - непусто

{ binTree x;

if (t==NULL){cout<< "rotateR(NULL)"<<endl; }

else {

x = t->lt;

t->lt = x->rt;

x->rt = t;

t =x;

}

}

voidrotateL (binTree&t)

//b - непусто

{ binTreex;

if (t==NULL){

cout<< "rotateL(NULL)"<<endl; }

else {

x = t->rt;

t->rt = x->lt;

x->lt = t;

t =x;

}

}

voidinsInRoot (binTree&b, base x)

{ if (b==NULL) {

b = new node;

if ( b != NULL) {

b ->info = x;

b ->count = 1;

}

else {cerr<<"1 Memory not enough\n"; exit(1);}

} else

if (x < b->info) {insInRoot (b->lt, x); rotateR (b);}

elseif (x > b->info) {insInRoot (b->rt, x); rotateL (b);}

else b->count++;

}

Infile2:Acdefg

БЛОКСХЕМА :

Схема алгоритма для сьаласировка бинарного дерева.

Схема алгоритма для сьаласировка бинарного дерева. - student2.ru

Наши рекомендации