
Заключение
В ходе работы было создано бинарное дерево поиска с поддержкой основных операций: добавление, удаление, очистка, вывод, поиск максимального элементов.
Приложение а
(обязательное)
class Node
{
public int Data;
public Node Left;
public Node Right;
public Node(int data)
{
Data = data;
Left = null;
Right = null;
}
}
class Tree
{
private Node Root;
public Tree() // инициализация пустого дерева
{
Root = null;
}
public bool AddItem(int a)
{
if (Root == null)
{
Root = new Node(a); // если пусто, то становится корнем
return true;
}
return AddItemRecursive(Root, a);
}
private bool AddItemRecursive(Node current, int a)
{
if (a == current.Data) // если элмент уже есть
return false;
if (a < current.Data) // если добавляемый меньше текущего, то добавляем влево
{
if (current.Left == null)
{
current.Left = new Node(a);
return true;
}
return AddItemRecursive(current.Left, a);
}
else // если добавляемый больше текущего, то добавляем вправо
{
if (current.Right == null)
{
current.Right = new Node(a);
return true;
}
return AddItemRecursive(current.Right, a);
}
}
public bool RemoveItem(int a)
{
bool found;
Root = RemoveItemRecursive(Root, a, out found);
return found;
}
private Node RemoveItemRecursive(Node current, int a, out bool found)
{
found = false;
if (current == null) return null; // если элемента нет
if (a < current.Data) // если меньше текущего, то идем в левую ветку
{
current.Left = RemoveItemRecursive(current.Left, a, out found);
}
else if (a > current.Data) // если больше текущего, то идем в правую ветку
{
current.Right = RemoveItemRecursive(current.Right, a, out found);
}
else
{
found = true;
// если 1 элемент или нет дочерних
if (current.Left == null) return current.Right;
if (current.Right == null) return current.Left;
// если 2 элемента, то ищем меньший
current.Data = FindMinValue(current.Right);
current.Right = RemoveItemRecursive(current.Right, current.Data, out found);
}
return current;
}
private int FindMinValue(Node current) // до конца влево, потому-что меньшее
{
while (current.Left != null)
{
current = current.Left;
}
return current.Data;
}
public void Clear()
{
Root = null;
}
public int FindMax()
{
if (Root == null) throw new InvalidOperationException("Дерево пустое");
Node current = Root;
while (current.Right != null) // до конца вправо, потому-что большее
{
current = current.Right;
}
return current.Data;
}
public void Print() //в ширину
{
if (Root == null)
{
Console.WriteLine("Дерево пустое");
return;
}
Queue<Node> queue = new Queue<Node>(); // хранилище узлов
queue.Enqueue(Root);
while (queue.Count > 0) // пока есть узлы - пашем
{
Node current = queue.Dequeue(); // вывод первого узла
Console.Write(current.Data + " ");
if (current.Left != null) queue.Enqueue(current.Left); // если есть потомок слева - в очередь
if (current.Right != null) queue.Enqueue(current.Right); // если есть справа- в очередь
}
Console.WriteLine(); // новая строка
}
}
class Program
{
static void Main()
{
Tree tree = new Tree();
bool running = true;
while (running)
{
Console.WriteLine("\nВыберите действие:");
Console.WriteLine("1 - Добавить элемент в дерево");
Console.WriteLine("2 - Удалить элемент из дерева");
Console.WriteLine("3 - Очистить дерево");
Console.WriteLine("4 - Показать дерево");
Console.WriteLine("5 - Найти максимальный элемент");
Console.WriteLine("6 - Выйти");
Console.Write("Введите ваш выбор: ");
int choice = int.Parse(Console.ReadLine());
switch (choice)
{
case 1:
Console.Write("Введите элемент для добавления: ");
int addValue = int.Parse(Console.ReadLine());
if (tree.AddItem(addValue))
Console.WriteLine("Элемент успешно добавлен.");
else
Console.WriteLine("Элемент уже существует в дереве.");
break;
case 2:
Console.Write("Введите элемент для удаления: ");
int removeValue = int.Parse(Console.ReadLine());
if (tree.RemoveItem(removeValue))
Console.WriteLine("Элемент успешно удален.");
else
Console.WriteLine("Элемент не найден.");
break;
case 3:
tree.Clear();
Console.WriteLine("Дерево очищено.");
break;
case 4:
Console.WriteLine("Дерево:");
tree.Print();
break;
case 5:
try
{
Console.WriteLine("Самый большой элемент в дереве: " + tree.FindMax());
}
catch (InvalidOperationException e)
{
Console.WriteLine(e.Message);
}
break;
case 6:
running = false;
break;
default:
Console.WriteLine("Неверный выбор, попробуйте снова.");
break;
}
}
}
}
Томск 2024