Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
YaP_laby.pdf
Скачиваний:
157
Добавлен:
31.05.2015
Размер:
915.49 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА № 16 БИНАРНЫЕ ДЕРЕВЬЯ

Техника программирования с операциями на дереве подробно излагается в метод. указаниях Шитов, Ю. А. Рекурсия / Ю. А. Шитов. – Красноярск

: ИПК СФУ, 2007.

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

Цель работы – овладеть навыками алгоритмизации и программирования задач, в которых используются деревья.

Задания

1.Изучить:

а) терминологию, основные определения и понятия по теме«Деревья»; б)алгоритм формирования дерева; в)программные реализации алгоритмов формирования деревьев;

г) алгоритм удаления элемента из дерева; д)программная реализация алгоритма удаления элемента из дерева; е) алгоритмы обходов деревьев;

ж) программные реализации алгоритмов обходов деревьев.

2.Разработать алгоритм решения в соответствии с заданием.

3.Составить программу решения задачи.

4.Подготовить тестовый набор данных для контроля правильности вычисления значений функции.

Контрольныевопросы

1.Дать определение дерева.

2.Написать код рекурсивной функции, которая формирует дерево.

3.Выполнитьтрассировку алгоритма рекурсивного формирования дерева.

4.Написать код нерекурсивной функции, которая формирует дерево.

5.Выполните трассировку алгоритма нерекурсивного формирования

дерева.

6.Алгоритм прямого (preorder) обхода дерева. Программная реализация алгоритма.

7.Выполнить трассировку алгоритма прямого (preorder) обхода дерева.

8.Алгоритм симметричного (inorder) обхода дерева. Программная реализация алгоритма.

9.Выполнить трассировку алгоритма симметричного (inorder) обхода

дерева.

Языки программирования. Метод. указания по лаб. работам

-80-

ЛАБОРАТОРНАЯ РАБОТА № 16 БИНАРНЫЕ ДЕРЕВЬЯ

Контрольные вопросы

10.Алгоритм обратного (postorder) обхода дерева. Программная реализация алгоритма.

11.Выполнить трассировку алгоритмаобратного (postorder) обхода дерева.

12.Построить дерево с семью узлами, у которого четыре уровня.

13.Определите листья у построенного дерева.

Вариантызаданий

Во всех вариантах рассматриваются ориентированные бинарные деревья. В программах использовать нелинейные двусвязные списки.

Ввариантах 1–6 бинарное дерево задается в виде векторов смежности.

1.Упорядочить заданное бинарное дерево в прямом порядке.

2.Упорядочить заданное бинарное дерево в симметричном порядке.

3.Упорядочить заданное бинарное дерево в обратном порядке.

4.Определить, является ли заданный граф бинарным деревом.

5.Перечислить вершины максимального ранга в заданном бинарном

дереве.

6.Найти количество концевых вершин заданного бинарного дерева.

7.Построить дерево поиска по введенным целым числам. Определить количество листьев в данном дереве.

8.Построить дерево поиска по введенным целым числам. Определить высоту правого поддерева.

9.Построить дерево поиска по введенным целым числам. Определить высоту левого поддерева.

10.Построить дерево поиска по введенным целым числам. Минимальное значение элемента из каждого уровня заменить среднеарифметическим значением узлов из этого уровня

11.Построить дерево поиска по введенным целым числам. Удалить узел, содержащий максимальное число.

12.Построить дерево поиска по введенным целым числам. Удалить узел, содержащий минимальное число.

13.Построить дерево поиска по введенным целым числам. Удалить все листья данного дерева.

14.Построить дерево поиска по введенным целым числам. Определить количество узлов, имеющих одного потомка.

15.Построить дерево поиска по введенным целым числам. Удалить узел, соответствующий последнему введенному числу.

16.Построить дерево двоичного поиска для заданного множества целых чисел и занумеровать его вершины в соответствии с их обходом во внутреннем порядке.

17.Построить дерево двоичного поиска для заданного множества целых чисел и занумеровать его вершины в соответствии с порядком прямого обхода этого дерева.

Языки программирования. Метод. указания по лаб. работам

-81-

ЛАБОРАТОРНАЯ РАБОТА № 16 БИНАРНЫЕ ДЕРЕВЬЯ

Варианты заданий

18.Построить дерево двоичного поиска для заданного множества целых чисел и занумеровать его вершины в соответствии с их порядком при обратном обходе дерева.

19.Из входной последовательности слов построить дерево и удалить слово, которое встречается чаще всего.

20.Из входной последовательности слов построить дерево и удалить самое длинное слово.

21.Из входной последовательности слов построить дерево и удалить слова одного уровня.

22.Из входной последовательности слов построить дерево и составить массив из слов в порядке прямого обхода дерева.

23.Из входной последовательности слов построить дерево и составить массив из слов в порядке симметричного обхода дерева.

24.Из входной последовательности слов построить дерево и составить массив из слов в порядке обратного обхода дерева.

25.Построить двоичное дерево и проверить является ли оно сбалансированным.

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

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

28.Дано дерево. Удалить узлы, которые имеют одного левого потомка. Составить из этих узлов упорядоченный массив.

29.Дано дерево. Удалить узлы, которые имеют одного правого потомка. Составить из этих узлов упорядоченный массив.

30.Дано дерево. Удалить узлы, которые являются родителями листа. Составить из этих узлов упорядоченный массив.

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

struct node

 

 

 

 

{ int kl, lev, c;

// kl – ключ узла; lev – уровень узла;

 

node *l,*r;

// c – число повторений узла;

 

};

 

 

 

 

node *tree(node *p,int h,int x);

 

// Формирование дерева

 

void treeprint(node *p, int n);

 

// Вывод дерева

 

void yroven(node *p, int n);

 

// Определение уровня вершин

 

void ydalenie ( int n, node **p);

// Удаление номера n

 

void ydal ( node **p);

 

 

 

node *poisk( int n, node *p);

// Поиск узла с номером n

 

node *find_min (node *p);

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

 

 

 

Языки программирования. Метод. указания по лаб. работам

-82-

ЛАБОРАТОРНАЯ РАБОТА № 16 БИНАРНЫЕ ДЕРЕВЬЯ

Варианты заданий

node *find_max (node *p);

void vstavka( int n, node **p, node **cor); // Вставка узла с номером n

void main()

{ node *root, *rw; int h, x = 0;

FILE *f; root = NULL; clrscr();

f = fopen("test.dat","r"); while( !feof(f) )

{

fscanf(f,"%d",&h); root = tree(root,h,x);

}

treeprint(root, 0);

// Поиск уровня

cout << "\n\t Удали звено n= "; cin >> h;

clrscr(); rw = root;

ydalenie(h, &rw);

cout << "\t\tДерево после удаления звена с номером "

<< h << "\n"; treeprint(root, 0);

cout << "\n\tНайди звено с номером n= "; cin >> h;

rw = poisk(h, root); if ( rw == NULL )

{ cout << "\nЗвена с номером n= " << h << " НЕТ !!!\n\n";}

else cout << "\nЗвено с номером n= " << rw -> kl << " найдено !\n\n";

// Поиск минимального rw = find_min( root );

cout << "Минимальное значение ключа в дереве = " << rw -> kl << "\n\n";

rw = find_max( root );

cout << "Махсимальное значение ключа в дереве = " << rw -> kl << "\n\n"; cout << "Вставь звено с номером n= ";

cin >> h; clrscr();

vstavka( h, &rw, &root);

cout << "\t\tДерево после вставки звена с номером "

<< h << "\n";

Языки программирования. Метод. указания по лаб. работам

-83-

ЛАБОРАТОРНАЯ РАБОТА № 16 БИНАРНЫЕ ДЕРЕВЬЯ

Варианты заданий

treeprint(root, 0);

printf ("Введите уровень "); scanf("%d",&h);

yroven(root, h); getch();

}

// Всавка элемента с номером n void vstavka( int n, node **p, node **cor)

{

node *nov, *ss; int bool;

nov = new node; nov -> l = NULL; nov -> r = NULL; nov -> kl = n;

if ( *cor == NULL ) {(*cor) = nov;} else

{

*p = *cor;

// Указатель на корень дерева

//пересылаем в переменную для промежуточ

//ных данных

do

// Цикл определяет место всавки

{

 

 

if ( n == (*p) -> kl ) break;

 

ss = *p;

// Запоминаем указатель на звено

bool = n < ss -> kl;

 

if ( bool )

{*p = ( *p ) -> l;}

else *p = (*p) -> r;

 

} while ( *p != NULL );

 

if ( bool ) { ss -> l = nov;}

// Присоединяем новое звено к

else ss -> r = nov;

// дереву

}

 

 

}

 

 

node *find_min (node *p)

// Поиск минимального

{

 

 

if ( p != NULL )

 

{

 

 

while ( p -> l)

 

p = p -> l;

}

return p;

}

Языки программирования. Метод. указания по лаб. работам

-84-

ЛАБОРАТОРНАЯ РАБОТА № 16 БИНАРНЫЕ ДЕРЕВЬЯ

Варианты заданий

node *find_max (node *p)

// Поиск минимального

{

 

if ( p != NULL )

 

{

 

while ( p -> r)

 

p = p -> r;

 

}

 

return p;

 

}

 

node *poisk( int n, node *p) // Поиск звена с номером n

{

int pr = 1; do

{

if ( n == p -> kl ) { pr = 0; }

else

{

if( n < p -> kl) { p = p -> l; }

else

p = p -> r;

}

} while ( (p != NULL) && ( pr ) ); return p;

}

node *tree(node *p,int h,int x)

// Построение дерева

{

if(p == NULL)

 

{

p = new node;

 

if(x == 0) x = p -> lev = 1; else p -> lev = x+1;

p->kl = h; p->c = 1; p->l = NULL; p->r = NULL;

}

else if(h == p->kl) p->c = p->c + 1; else if(h < p->kl)

p->l = tree(p->l, h, p->lev); else

p->r = tree(p->r, h, p->lev); return p;

}

Языки программирования. Метод. указания по лаб. работам

-85-

ЛАБОРАТОРНАЯ РАБОТА № 16 БИНАРНЫЕ ДЕРЕВЬЯ

Варианты заданий

void treeprint(node *p, int n)

{

int k;

if(p!=NULL)

{treeprint(p->l, n+1);

for ( k = 1; k <= n; k++) cout << " " ; cout << p -> kl << "\n";

treeprint(p->r, n+1);

}

}

void yroven(node *p, int n)

{

int k;

if(p != NULL)

{ yroven(p->l, n); if(p->lev == n) printf("%d\t",p->kl);

yroven(p->r, n);

}

 

 

}

 

 

node *q;

 

 

void ydal ( node **rp)

 

{

 

 

if ( (*rp) -> r != NULL )

 

{ ydal ( &((*rp) -> r) ); }

 

else {

 

 

q -> kl = (*rp) -> kl;

 

q = *rp;

 

*rp = (*rp) -> l;

 

delete q;

 

}

 

 

}

// Конец процедуры ydal

 

void ydalenie ( int n, node **p)

 

{

 

 

if ( *p == NULL )

 

Языки программирования. Метод. указания по лаб. работам

-86-

ЛАБОРАТОРНАЯ РАБОТА № 16 БИНАРНЫЕ ДЕРЕВЬЯ

Варианты заданий

{ cout << "Звена с ключом " << n << " НЕТ !!!\n";}

else

{

if ( n < (*p) -> kl )

{ ydalenie(n, &((*p) -> l));} else

{

if ( n > (*p) -> kl )

{ ydalenie(n, &((*p) -> r));} else // Удаление

{

q = *p;

if ( q -> r == NULL)

{*p = q -> l; } else

if ( q -> l == NULL )

{*p = q -> r;}

else ydal ( &(q -> l));

} } } } }

Языки программирования. Метод. указания по лаб. работам

-87-

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