сд5
.pdf
Рисунок 2.9 – Удаление элемента с поддеревом
Рисунок 2.10 – Наименьший элемент является листом
11
Рисунок 2.11 – Наименьший элемент имеет поддерево
12
3Заключение
Входе выполнения практической работы была реализована программа инициализации бинарного дерева поиска и методы работы с ним с помощью классов Node и Tree. Представлены схемы удаления элементов из бинарного дерева поиска для лучшего понимания процедуры удаления.
Реализация программы представлена в приложении А.
13
Приложение А
using System;
using System.Collections.Generic;
public class Node
{
public int Value; public Node Left; public Node Right;
public Node(int value)
{
Value = value;
Left = null;
Right = null;
}
}
public class BinarySearchTree
{
private Node root;
// Инициализация пустого дерева public BinarySearchTree()
{
root = null;
}
// Добавление элемента в дерево public bool AddItem(int value)
{
if (root == null)
{
root = new Node(value); return true;
}
return AddItemRecursive(root, value);
14
}
private bool AddItemRecursive(Node current, int value)
{
if (value == current.Value)
{
return false; // Элемент уже существует
}
if (value < current.Value)
{
if (current.Left == null)
{
current.Left = new Node(value); return true;
}
return AddItemRecursive(current.Left, value);
}
else
{
if (current.Right == null)
{
current.Right = new Node(value); return true;
}
return AddItemRecursive(current.Right, value);
}
}
// Удаление элемента из дерева public bool RemoveItem(int value)
{
bool isRemoved;
root = RemoveItemRecursive(root, value, out isRemoved); return isRemoved;
}
private Node RemoveItemRecursive(Node current, int value, out bool isRemoved)
15
{
isRemoved = false; if (current == null)
{
return null;
}
if (value == current.Value)
{
isRemoved = true;
//Узел для удаления найден
//Узел без потомков
if (current.Left == null && current.Right == null)
{
return null;
}
// Узел с одним потомком if (current.Left == null)
{
return current.Right;
}
if (current.Right == null)
{
return current.Left;
}
// Узел с двумя потомками: ищем минимальный элемент в правом
поддереве
int minValue = FindMin(current.Right); current.Value = minValue;
current.Right = RemoveItemRecursive(current.Right, minValue, out
_);
return current;
}
16
if (value < current.Value)
{
current.Left = RemoveItemRecursive(current.Left, value, out
isRemoved);
}
else
{
current.Right = RemoveItemRecursive(current.Right, value, out
isRemoved);
}
return current;
}
// Очистка дерева public void Clear()
{
root = null;
}
// Вывод дерева (поиск в ширину) public string Print()
{
if (root == null)
{
return "Дерево пусто";
}
Queue<Node> queue = new Queue<Node>(); queue.Enqueue(root);
List<int> result = new List<int>();
while (queue.Count > 0)
{
Node current = queue.Dequeue(); result.Add(current.Value);
17
if (current.Left != null)
{
queue.Enqueue(current.Left);
}
if (current.Right != null)
{
queue.Enqueue(current.Right);
}
}
return string.Join(", ", result);
}
// Нахождение минимального элемента public int FindMin()
{
if (root == null)
{
throw new InvalidOperationException("Дерево пусто.");
}
return FindMin(root);
}
private int FindMin(Node current)
{
while (current.Left != null)
{
current = current.Left;
}
return current.Value;
}
// Нахождение максимального элемента public int FindMax()
18
{
if (root == null)
{
throw new InvalidOperationException("Дерево пусто.");
}
return FindMax(root);
}
private int FindMax(Node current)
{
while (current.Right != null)
{
current = current.Right;
}
return current.Value;
}
}
public class Program
{
public static void Main(string[] args)
{
BinarySearchTree bst = new BinarySearchTree();
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.WriteLine("7. Выйти");
Console.Write("Выберите действие: ");
19
string choice = Console.ReadLine();
switch (choice)
{
case "1":
Console.Write("Введите элемент для добавления: "); int elementToAdd = int.Parse(Console.ReadLine()); if (bst.AddItem(elementToAdd))
{
Console.WriteLine($"Элемент {elementToAdd}
добавлен.");
}
else
{
Console.WriteLine($"Элемент {elementToAdd} уже
существует.");
}
break;
case "2":
Console.Write("Введите элемент для удаления: "); int elementToRemove = int.Parse(Console.ReadLine()); if (bst.RemoveItem(elementToRemove))
{
Console.WriteLine($"Элемент {elementToRemove}
удален.");
}
else
{
Console.WriteLine("Элемент не найден.");
}
break;
case "3": bst.Clear();
Console.WriteLine("Дерево очищено."); break;
20
