Практическая работа №5
.pdfЗаключение
В ходе работы были получены навыки реализации бинарного дерева поиска и разработки алгоритмов взаимодействия с ним на языке программирования 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
