Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Болтушкин Л.С., группа 712-2, практика 5.docx
Скачиваний:
7
Добавлен:
04.10.2024
Размер:
581.12 Кб
Скачать

Заключение

В результате практической работы был написан алгоритм реализации бинарного дерева в соответствии с заданным условием. Также был написан метод по нахождению степени дерева.

Приложение а (обязательное)

using System;

using System.Collections.Generic;

public class BinarySearchTree

{

private class Node

{

public int Value; // Значение, хранящееся в узле

public Node? Left; // Ссылка на левое поддерево

public Node? Right; // Ссылка на правое поддерево

// Конструктор для создания нового узла с определенным значением

public Node(int value)

{

this.Value = value; // Инициализируем значение узла

}

}

private Node? root; // Корневой узел дерева, инициализирован как null

// Конструктор для создания пустого бинарного дерева

public BinarySearchTree()

{

root = null; // Инициализируем корень как null

}

// Метод для добавления элемента в дерево

public bool AddItem(int value)

{

if (root == null) // Если дерево пусто

{

root = new Node(value); // Создаем корневой узел

return true; // Возвращаем true, так как элемент добавлен

}

else

{

return Insert(root, value); // Вызываем вспомогательный метод для вставки элемента

}

}

// Рекурсивный вспомогательный метод для вставки элемента в дерево

private bool Insert(Node node, int value)

{

if (value < node.Value) // Если значение меньше, чем в текущем узле

{

if (node.Left == null) // И если левый потомок отсутствует

{

node.Left = new Node(value); // Создаем новый левый узел

return true; // Возвращаем true, так как элемент добавлен

}

else

{

return Insert(node.Left, value); // Продолжаем поиск места в левом поддереве

}

}

else if (value > node.Value) // Если значение больше, чем в текущем узле

{

if (node.Right == null) // И если правый потомок отсутствует

{

node.Right = new Node(value); // Создаем новый правый узел

return true; // Возвращаем true, так как элемент добавлен

}

else

{

return Insert(node.Right, value); // Продолжаем поиск места в правом поддереве

}

}

// Если значение уже существует в дереве

return false; // Возвращаем false, так как элемент не добавлен

}

// Метод для удаления элемента из дерева

public bool RemoveItem(int value)

{

root = Remove(root, value, out bool removed); // Вызываем рекурсивный метод для удаления узла

return removed; // Возвращаем статус удаления

}

// Рекурсивный вспомогательный метод для удаления элемента из дерева

private Node? Remove(Node? node, int value, out bool removed)

{

removed = false; // Инициализируем статус удаления как false

if (node == null) return null; // Если узла не существует, возвращаем null

if (value < node.Value) // Если значение меньше текущего узла

{

node.Left = Remove(node.Left, value, out removed); // Ищем узел для удаления в левом поддереве

}

else if (value > node.Value) // Если значение больше текущего узла

{

node.Right = Remove(node.Right, value, out removed); // Ищем узел для удаления в правом поддереве

}

else // Если значение найдено

{

removed = true; // Устанавливаем статус удаления как true

// Если у узла есть только один потомок или его нет

if (node.Left == null)

return node.Right; // Возвращаем правый потомок

else if (node.Right == null)

return node.Left; // Возвращаем левый потомок

// Если у узла два потомка

node.Value = MinValue(node.Right); // Находим минимальное значение в правом поддереве

node.Right = Remove(node.Right, node.Value, out _); // Удаляем узел, который теперь содержит минимальное значение

}

return node; // Возвращаем обновленный узел

}

// Статический метод для нахождения минимального значения в поддереве

private static int MinValue(Node node)

{

int minValue = node.Value; // Начальное значение минимума - значение текущего узла

while (node.Left != null) // Пока есть левые потомки

{

minValue = node.Left.Value; // Обновляем минимальное значение

node = node.Left; // Переходим к следующему левому потомку

}

return minValue; // Возвращаем минимальное значение

}

// Метод для очистки дерева

public void Clear()

{

root = null; // Устанавливаем корень как null, что удаляет все узлы

}

// Метод для печати значений дерева

public void Print()

{

if (root == null) // Если дерево пустое

{

Console.WriteLine("Tree is empty"); // Выводим сообщение о пустом дереве

return; // Завершаем метод

}

Queue<Node> queue = new Queue<Node>(); // Создаем очередь для обхода узлов

queue.Enqueue(root); // Добавляем корневой узел в очередь

while (queue.Count > 0) // Пока в очереди есть элементы

{

Node current = queue.Dequeue(); // Извлекаем узел из очереди

Console.Write(current.Value + " "); // Выводим значение узла

if (current.Left != null) // Если есть левый потомок

queue.Enqueue(current.Left); // Добавляем его в очередь

if (current.Right != null) // Если есть правый потомок

queue.Enqueue(current.Right); // Добавляем его в очередь

}

Console.WriteLine(); // Переходим на новую строку после печати всех значений

}

// Метод для вычисления степени дерева

public int Degree()

{

return Degree(root); // Вызываем рекурсивный вспомогательный метод для корня

}

// Рекурсивный вспомогательный метод для вычисления степени дерева

private int Degree(Node? node)

{

if (node == null) // Если узел пустой

return 0; // Степень равна 0

int leftDepth = Degree(node.Left); // Вычисляем степень левого поддерева

int rightDepth = Degree(node.Right); // Вычисляем степень правого поддерева

return Math.Max(leftDepth, rightDepth) + 1; // Возвращаем наибольшую степень + 1

}

public static void Main(string[] args)

{

BinarySearchTree tree = new BinarySearchTree(); // Создаем экземпляр дерева

tree.AddItem(60);

tree.AddItem(70);

tree.AddItem(65);

tree.AddItem(63);

tree.AddItem(90);

tree.AddItem(50);

tree.Print();

Console.WriteLine("Степень дерева: " + tree.Degree());

}

}