Практики(Вариант №1) / Практическая работа №5
.pdfПриложение А
(обязательное) Код программы
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
|
|
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);
public int FindMax()
{
if (Root == null)
throw new InvalidOperationException("Дерево пустое");
}return FindMaxRecursive(Root);
|
private int FindMaxRecursive(Node node) |
||
|
{ |
while (node.Right != null) |
|
|
|
||
|
|
{ |
node = node.Right; |
|
|
} |
|
|
|
|
|
|
} |
return node.Data; |
|
} |
|
|
|
|
|
|
|
// Пример использования 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.FindMax()}");
// Удаление элементов 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.FindMax()}");
// Очистка дерева tree.Clear();
Console.WriteLine("\nПосле очистки:"); Console.WriteLine(tree.Print());
// Проверка на пустом дереве try
{Console.WriteLine($"Самый большой элемент в дереве: {tree.FindMax()}");
}
catch (InvalidOperationException ex)
{Console.WriteLine(ex.Message);
}} }
14
