Заключение
В результате практической работы был написан алгоритм реализации бинарного дерева в соответствии с заданным условием. Также был написан метод по нахождению степени дерева.
Приложение а (обязательное)
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());
}
}
