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

Практики(Вариант №7) / Практическая работа №5

.pdf
Скачиваний:
0
Добавлен:
23.02.2026
Размер:
495.73 Кб
Скачать
}
else
{
}

Приложение А

(обязательное) Код программы

using System;

using System.Collections.Generic; public class Node

{public int Data { get; set; } public Node Left { get; set; } public Node Right { get; set; } public Node(int data)

{Data = data; Left = null; Right = null;

}

}

 

 

 

 

 

public class Tree

{

public Node Root { get; private set; }

 

 

public Tree()

 

{

Root = null;

 

}

 

 

 

 

// Инициализация пустого дерева

 

public void Initialize()

 

{

Root = null;

 

}

 

 

 

 

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

 

public bool AddItem(int a)

 

{

if (Root == null)

 

 

 

 

{

Root = new Node(a);

 

 

 

 

 

}

return true;

 

 

 

}return AddItemRecursive(Root, a);

private bool AddItemRecursive(Node node, int a)

{

if (a == node.Data)

 

 

 

 

 

return false;

 

 

if (a < node.Data)

 

 

{

if (node.Left == null)

 

 

 

 

{

node.Left =

new Node(a);

 

 

 

 

 

 

return true;

 

return AddItemRecursive(node.Left, a);

11

}
else
{

 

 

if (node.Right == null)

 

 

{

node.Right = new Node(a);

 

 

 

 

 

}

return true;

 

 

 

 

 

else

 

 

 

{

return AddItemRecursive(node.Right, a);

 

 

}

 

}

 

}

 

 

 

 

 

// Удаление элемента из дерева

public bool RemoveItem(int a)

{

if (Root == null)

 

 

 

return false;

 

bool found = false;

 

Root = RemoveItemRecursive(Root, a, ref found);

}

return found;

 

 

private

Node RemoveItemRecursive(Node node, int a, ref bool found)

{

if (node == null)

 

 

 

return null;

 

if (a < node.Data)

 

{

node.Left = RemoveItemRecursive(node.Left, a, ref found);

 

}

 

 

 

else if (a > node.Data)

 

{

node.Right = RemoveItemRecursive(node.Right, a, ref found);

 

}

 

 

 

else

 

 

{

found = true;

 

 

 

 

// узел с одним потомком или без потомков

 

 

if (node.Left == null)

 

 

return node.Right;

 

 

else if (node.Right == null)

 

 

return node.Left;

 

 

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

 

 

node.Data = FindMinValue(node.Right);

 

}

node.Right = RemoveItemRecursive(node.Right, node.Data, ref found);

 

 

}

return node;

 

 

private

int FindMinValue(Node node)

{

int

minValue = node.Data;

 

 

while (node.Left != null)

 

{

minValue = node.Left.Data;

 

 

 

 

node = node.Left;

 

}

 

}

return minValue;

 

 

// Очистка дерева

 

 

12

 

public void Clear()

 

{

Root = null;

 

}

 

 

 

 

// Вывод дерева (поиск в ширину)

 

public string Print()

 

{

if (Root == null)

 

 

 

 

 

return "Дерево пустое";

 

 

List<string> result = new List<string>();

 

 

Queue<Node> queue = new Queue<Node>();

 

 

queue.Enqueue(Root);

 

 

while (queue.Count > 0)

 

 

{

Node current = queue.Dequeue();

 

 

 

 

 

 

result.Add(current.Data.ToString());

 

 

 

if (current.Left != null)

 

 

 

queue.Enqueue(current.Left);

 

 

 

if (current.Right != null)

 

 

}

queue.Enqueue(current.Right);

 

 

 

 

}

return string.Join(" ", result);

 

 

 

 

// Вариант 7: Метод для нахождения высоты дерева

 

public int GetHeight()

 

{

return GetHeightRecursive(Root);

 

}

 

 

 

 

private int GetHeightRecursive(Node node)

 

{

if (node == null)

 

 

 

 

 

return 0;

 

 

int leftHeight = GetHeightRecursive(node.Left);

 

 

int rightHeight = GetHeightRecursive(node.Right);

 

}

return Math.Max(leftHeight, rightHeight) + 1;

}

 

 

 

 

 

// Пример использования class Program

{static void Main()

{ Tree tree = new Tree();

// Добавление элементов Console.WriteLine("Добавление элементов:"); Console.WriteLine($"Добавлен 5: {tree.AddItem(5)}"); Console.WriteLine($"Добавлен 3: {tree.AddItem(3)}"); Console.WriteLine($"Добавлен 7: {tree.AddItem(7)}"); Console.WriteLine($"Добавлен 2: {tree.AddItem(2)}"); Console.WriteLine($"Добавлен 4: {tree.AddItem(4)}"); Console.WriteLine($"Добавлен 6: {tree.AddItem(6)}"); Console.WriteLine($"Добавлен 8: {tree.AddItem(8)}");

Console.WriteLine($"Повторное добавление 5: {tree.AddItem(5)}");

// Вывод дерева

Console.WriteLine("\nДерево (обход в ширину):"); Console.WriteLine(tree.Print());

13

// Высота дерева

Console.WriteLine($"\nВысота дерева: {tree.GetHeight()}");

// Удаление элементов Console.WriteLine("\nУдаление элементов:");

Console.WriteLine($"Удален 4: {tree.RemoveItem(4)}"); Console.WriteLine($"Удален 10 (не существует): {tree.RemoveItem(10)}");

// Вывод после удаления Console.WriteLine("\nДерево после удаления:"); Console.WriteLine(tree.Print());

Console.WriteLine($"Высота дерева: {tree.GetHeight()}");

// Очистка дерева tree.Clear();

Console.WriteLine("\nПосле очистки:");

Console.WriteLine(tree.Print());

} } Console.WriteLine($"Высота дерева: {tree.GetHeight()}");

14

Соседние файлы в папке Практики(Вариант №7)