Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПИА 4 лаба Давыдов.doc
Скачиваний:
9
Добавлен:
27.03.2015
Размер:
121.34 Кб
Скачать

2. Бинарное дерево поиска.

Дерево поиска – это двоичное дерево, в котором выполняются следующие условия

а) l(u) < l(v) для всех вершин u, v, если вершина u находится в поддереве, корень которого – левый преемник v;

б) l(u) > l(v) для всех вершин u, v, если вершина u находится в поддереве, корень которого – правый преемник v;

в) для всякого значения aÎ S существует единственная вершина v, для которой l(v) = a

Реализация программы

struct elem

{

char s[50];

int size;

public:

bool operator>(info d)

{ return (strcmp(s, d.s) == 1);}

};

struct tree

{

elem el;

tree *left;

tree *right;};

//добавление элемента в бинарное дерево поиска по ключу - строка

void IncludeString(tree **t,info w)

{

tree *q,*r,*z=NULL;

if (!(*t))

{

*t = new tree;

(*t)->el =w;

(*t)->left = NULL;

(*t)->right = NULL;

}

else

{

q = *t;

while (q)

{

z = q;

if (q->el>w)

q = q->left;

else

q = q->right;

}

r = new tree;

r->el = w;

r->left = NULL;

r->right = NULL;

if (z->el>w)

z->left = r;

else

z->right = r;

}

}

//добавление элемента в бинарное дерево поиска по ключу - размер

void IncludeSize(tree **t, elem w)

{

tree *q, *r, *z=NULL;

if (!(*t))

{

*t = new tree;

(*t)->el = w;

(*t)->left = NULL;

(*t)->right = NULL;

}

else

{

q = *t;

while (q)

{

z = q;

if (q->el.size>w.size)

q = q->left;

else

q = q->right;

}

r = new tree;

r->el = w;

r->left = NULL;

r->right = NULL;

if (z->el.size>w.size)

z->left = r;

else

z->right = r;

}

}

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

void search_elem_String(tree *t, elem w)

{

tree *q = t;

while (q)

{

if (w > q->el)

q = q->right;

else

if (q->el > w)

q = q->left;

else

return;

}

}

//поиск данного элемента по размеру в бинарном дереве поиска

void search_elem_size(tree *t, elem w)

{

tree *q = t;

while (q)

{

if (w.size > q->el.size)

q = q->right;

else

if (q->el.size > w.size)

q = q->left;

else

{

q = q->right;

}

}

}

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

info search_max(tree *t)

{

tree *q = t;

while (q->right)

{

q = q->right;

}

return q->el;

}

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

info search_min(tree *t)

{

tree *q = t;

while (q->left)

{

q = q->left;

}

return q->el;

}

//поиск высоты бинарного дерева поиска

void heightTree(tree *t,int i)

int max=0;

if (t != NULL)

{

if (i > max) max = i;

heightTree(t->left, ++i);

i--;

heightTree(t->right, ++i);

i--;

}

}

//сортировка

void sort(tree *t, FILE *in)

{ if (t)

{

sort(t->left,in);

fprintf(in, "%ld\n", t->el.size);

sort(t->right, in);

}

}

Результаты.

Ключ

Высота

Кол-во узлов

Мин. элемент

Макс. элемент

Время на построение

Время на сортировку

Имя

1640

128200

Имя:taz.bmp

Размер: 1438

Имя: Онлайн-регистрация продукта ASUS.lnk

Размер : 1142

12009

240

Размер

3430

128200

Имя:lol.txt Размер: 0

Имя : hiberfil.sys Размер: 6775930880

2124

242

Поиск элемента по размеру

Среднего: 1343 Худшего: 3543

Поиск элемента ключ- имя файла

Среднего: 812 Худшего: 1543

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]