СД Практика 5
.pdf
2.6 Метод Minimum()
Метод Minimum() находит наименьший элемент в дереве и возвращает его. Происходит проверка узлов, если дерево пустое, то метод возвращает null. Если же элементы имеются в дереве, то с помощью цикла while метод проходит по левым поддеревьям, пока не найдет наименьший элемент. Реализация метода представлена на рисунке 2.7.
Рисунок 2.7 – Метод Minimum()
Результат работы программы представлен на рисунке 2.8.
Рисунок 2.8 – Результат
11
Заключение
В ходе выполнения данной практической работы было реализовано бинарное дерево поиска с помощью классов, а также типовые методы для работы с ним.
12
Приложение А
public class Node
{
public int Data; public Node Left; public Node Right;
public Node(int data)
{
Data = data;
Left = null;
Right = null;
}
}
public class Tree
{
public Node Root;
public Tree()
{
Root = null;
}
public bool AddItem(int a)
{
if (Root == null)
{
Root = new Node(a);
13
return true;
}
return AddItemRecursive(Root, a);
}
private bool AddItemRecursive(Node node, int a)
{
if (node.Data == a)
{
return false;
}
if (a < node.Data)
{
if (node.Left == null)
{
node.Left = new Node(a); return true;
}
else
{
return AddItemRecursive(node.Left, a);
}
}
else
{
if (node.Right == null)
{
14
node.Right = new Node(a); return true;
}
else
{
return AddItemRecursive(node.Right, a);
}
}
}
public bool RemoveItem(int a)
{
if (Root == null)
{
return false;
}
return RemoveItemRecursive(ref Root, a);
}
private bool RemoveItemRecursive(ref Node node, int a)
{
if (node == null)
{
return false;
}
if (a < node.Data)
{
15
return RemoveItemRecursive(ref node.Left, a);
}
else if (a > node.Data)
{
return RemoveItemRecursive(ref node.Right, a);
}
else
{
if (node.Left == null && node.Right == null)
{
node = null; return true;
}
if (node.Left == null)
{
node = node.Right; return true;
}
else if (node.Right == null)
{
node = node.Left; return true;
}
Node minimum = FindMin(node.Right); node.Data = minimum.Data;
RemoveItemRecursive(ref node.Right, minimum.Data); return true;
}
}
16
private Node FindMin(Node node)
{
while (node.Left != null)
{
node = node.Left;
}
return node;
}
public int? Minimum(Node node)
{
if (node == null)
{
return null;
}
while (node.Left != null)
{
node = node.Left;
}
return node.Data;
}
public void Clear()
{
Root = null;
Console.WriteLine("Дерево срублено!");
}
17
public void PrintTree()
{
if (Root == null)
{
Console.WriteLine("От дерева один пенек :("); return;
}
Queue<Node> tree = new Queue<Node>(); tree.Enqueue(Root);
while (tree.Count > 0)
{
Node current = tree.Dequeue();
Console.Write(current.Data + " ");
if (current.Left != null)
{
tree.Enqueue(current.Left);
}
if (current.Right != null)
{
tree.Enqueue(current.Right);
}
}
Console.WriteLine();
}
}
18
public class Program
{
public static void Main()
{
try
{
Tree CoconutTree = new Tree();
Console.Write("Введите элементы для добавления через пробел: "); string coconuts = Console.ReadLine();
int[] ArrayCoconuts = coconuts.Split(' ').Select(x => int.Parse(x)).ToArray();
for (int i = 0; i < ArrayCoconuts.Length; i++)
{
CoconutTree.AddItem(ArrayCoconuts[i]);
}
Console.Write("Дерево: ");
CoconutTree.PrintTree();
Console.Write("Самый маленький элемент: ");
int? TheSmallestCoconut = CoconutTree.Minimum(CoconutTree.Root); Console.WriteLine(TheSmallestCoconut);
Console.Write("Введите элемент, который хотите удалить: "); int RemovedCoconut = int.Parse(Console.ReadLine()); CoconutTree.RemoveItem(RemovedCoconut);
19
Console.Write("Дерево после удаления элемента: ");
CoconutTree.PrintTree();
Console.Write("Самый маленький элемент после удаления: "); TheSmallestCoconut = CoconutTree.Minimum(CoconutTree.Root); Console.WriteLine(TheSmallestCoconut);
CoconutTree.Clear();
}
catch(Exception)
{
Console.WriteLine("Что-то пошло не так :(");
}
}
}
20
