Практики(Вариант №7) / Практическая работа №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); |
|
|
|
|
|
|
// Вариант 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
