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

Практическая работа №5

.pdf
Скачиваний:
4
Добавлен:
24.01.2025
Размер:
884.54 Кб
Скачать

Заключение

В ходе работы были получены навыки реализации бинарного дерева поиска и разработки алгоритмов взаимодействия с ним на языке программирования C#. Отчет был написан согласно ОС ТУСУР 01-2021.

11

Приложение А

Код программы

Tree tree = new Tree(); tree.AddItem(3); tree.AddItem(3); tree.AddItem(6); tree.AddItem(10); tree.AddItem(2); tree.AddItem(4); tree.AddItem(5); tree.AddItem(1);

Console.WriteLine(tree.RemoveItem(6)); int[] mas = tree.MaxTwice();

Node a = tree.FindMin(); Console.WriteLine(a.data); class Node

{

public int data; public Node Left; public Node Right; public Node Parent; public Node(int data)

{

this.data = data;

}

}

class Tree

{

public Node Root; public Tree() { } public Tree(Node node)

{

this.Root = node;

}

public bool AddItem(int elem)

{

Node node = new Node(elem); if (Root == null)

{

Root = node; return true;

}

Node current = Root; Node currentPrev = null; while (current != null)

{

currentPrev = current; if (current.data > elem)

{

current = current.Left;

}

else if (current.data < elem)

{

current = current.Right;

}

else return false;

}

node.Parent = currentPrev;

if (elem < currentPrev.data) currentPrev.Left = node; else currentPrev.Right = node;

return true;

12

}

public Node? Contains(int elem)

{

Node current = Root; while (current != null)

{

if (current.data > elem)

{

current = current.Left;

}

else if (current.data < elem)

{

current = current.Right;

}

else

{

return current;

}

}

return null;

}

public bool RemoveItem(int elem)

{

Node? current = Contains(elem);

if (current == null) return false; bool flag = true;

if (current.Left == null && current.Right == null)

{

if (current.Parent.data > current.data)

{

current.Parent.Left = null;

}

else

{

current.Parent.Right = null;

}

return true;

}

if (current.Left == null) //current.Right != null

{

if (current.Parent.data > elem)

{

current.Parent.Left = current.Right;

}

else

{

current.Parent.Right = current.Right;

}

return true;

}

else if (current.Right == null) //current.Left != null

{

if (current.Parent.data > elem)

{

current.Parent.Left = current.Left;

}

else

{

current.Parent.Right = current.Left;

}

return true;

}

else

{

13

Tree subtree = new Tree(current.Left); Node subelem = subtree.FindMax(); RemoveItem(subelem.data);

current.data = subelem.data; current.Left.Parent = current; return true;

}

}

public Node FindMin()

{

Node? current = this.Root; while (current.Left != null)

{

current = current.Left;

}

return current;

}

public Node FindMax()

{

Node? current = this.Root; while (current.Right != null)

{

current = current.Right;

}

return current;

}

public void Clear()

{

this.Root = null;

}

public void Print()

{

if (Root == null) return;

Queue<Node> queue = new Queue<Node>(); queue.Enqueue(Root);

while (queue.Count > 0)

{

Node node = queue.Dequeue(); Console.Write($"{node.data} ");

if (node.Left != null) queue.Enqueue(node.Left); if (node.Right != null) queue.Enqueue(node.Right);

}

}

public int[] MaxTwice()

{

int[] maximum = new int[2]; Tree subtree = this;

maximum[0] = subtree.FindMax().data; subtree.RemoveItem(maximum[0]); maximum[1] = subtree.FindMax().data; subtree.RemoveItem(maximum[1]); return maximum;

}

}

14