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

сд5

.pdf
Скачиваний:
5
Добавлен:
01.12.2024
Размер:
634 Кб
Скачать
☆

Рисунок 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

Соседние файлы в предмете Структуры данных