Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

авл деревья поиска ответы на вопросы vkclub152685050

.pdf
Скачиваний:
40
Добавлен:
08.08.2019
Размер:
869.17 Кб
Скачать

BigRightRotate(MainTree);

}

if (MainTree->Prev) MainTree = MainTree->Prev; else break;

}

Root = MainTree;

}

void AddTreeElem(Tree *&Root, Tree *NewElem)

{

Tree *MainTree = Root; if (!Root)

{

Root = new

Tree;

Root->elem

=

NewElem->elem;

Root->height

= 1;

Root->Prev

=

NULL;

Root->Left

=

NULL;

Root->Right = NULL;

MainTree =

Root;

}

else

{

while (true)

{

if (NewElem->elem < MainTree->elem)

{

if (MainTree->Left) MainTree = MainTree->Left; else

{

MainTree->Left = NewElem;

NewElem->Prev = MainTree; break;

}

}

else

{

if (MainTree->Right) MainTree = MainTree->Right; else

{

MainTree->Right = NewElem;

NewElem->Prev = MainTree; break;

}

}

}

BalanceTree(Root, MainTree);

}

}

vk.com/club152685050

vk.com/id446425943

Функция удаления элемента из дерева:

6

void DeleteTreeElem(Tree *&Root, Tree *&DeleteElem)

{

Tree *MainTree = Root;

Tree *TmpElem = NULL; Tree *OneMoreTmp = NULL; int counter = 0;

while (true)

{

if (MainTree)

{

if (DeleteElem->elem == MainTree->elem)

{

if (MainTree->Prev || GetHeight(MainTree) > 1)

{

OneMoreTmp = MainTree;

if (MainTree->Left || MainTree->Right)

{

if (MainTree->Right) MainTree = MainTree->Right; TmpElem = OneMoreTmp->Prev; while (MainTree->Left) MainTree = MainTree->Left; if (MainTree->Prev)

{

if (MainTree->Prev->Right == MainTree) MainTree->Prev->Right = NULL;

else

MainTree->Prev->Left = NULL;

}

if (TmpElem)

{

if (TmpElem->Right)

{

if (TmpElem->Right == OneMoreTmp) TmpElem->Right = MainTree;

else

TmpElem->Left = MainTree;

}

else

TmpElem->Left = MainTree;

}

if (MainTree->Prev != OneMoreTmp) TmpElem = MainTree->Prev;

else TmpElem = MainTree; MainTree->Prev = OneMoreTmp->Prev; if (OneMoreTmp->Right != MainTree)

{

MainTree->Right = OneMoreTmp->Right; if (MainTree->Right)

MainTree->Right->Prev = MainTree;

}

else

7

MainTree->Right = NULL;

if (OneMoreTmp->Left != MainTree)

{

MainTree->Left = OneMoreTmp->Left; if (MainTree->Left)

MainTree->Left->Prev = MainTree;

}

else

MainTree->Left = NULL; BalanceTree(Root, TmpElem);

}

else

{

TmpElem = MainTree->Prev; if (TmpElem)

{

if (TmpElem->Right)

{

if (TmpElem->Right == MainTree) TmpElem->Right = NULL;

else

TmpElem->Left = NULL;

}

else

TmpElem->Left = NULL;

}

BalanceTree(Root, TmpElem);

}

cout << "elem was deleted" << endl; ShowTree(counter, Root, 0);

cout << "Num of elements = " << counter<<endl; _getch();

return;

}

else

{

Root = NULL;

cout << "Tree is Empty Now" << endl; _getch();

return;

}

}

else if (DeleteElem->elem > MainTree->elem) MainTree = MainTree->Right;

else

MainTree = MainTree->Left;

}

else

{

cout << "No such elem in tree!" << endl; _getch();

return;

}

8

vk.com/club152685050
vk.com/id446425943

}

}

Таким образом, реализуется два первых пункта задания на лабораторную работу. Осталось реализовать функцию поиска в дереве и функцию, заданную вариантом задания.

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

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

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

1)Что такое дерево? Что такое высота и степень дерева?

2)Назовите способы реализации бинарного дерева. Сравните их.

3)Какие способы обхода бинарного дерева существуют?

4)Что такое дерево поиска?

5)Какова временная сложность алгоритма поиска в дереве поиска?

6)Что такое идеально сбалансированное дерево?

7)Что такое дерево, сбалансированное по АВЛ?

8)Какие операции применяют для восстановления сбалансированности дерева?

9