
Практика 5 - Бинарное дерево поиска - СФ
.pdf3Заключение
Врезультате практической работы были получены навыки с деревьями,
удаление, добавление элементов, вывод деревьев на консоль, также был написан
метод реализации варианта.
11
Приложение А
(обязательное)
using System;
using System.Collections;
using System.Collections.Generic; using System.Xml.Linq;
namespace SystemOfAData5
{
class Node<T> : IComparable<T>, IComparable where T : IComparable, IComparable<T>
{
public T Data { get; set; } public Node<T> Left { get; set; }
public Node<T> Right { get; set; } public Node(T data)
{
Data = data;
}
public Node<T> Parent { get; set; } public Node(T data, Node<T> parent)
{
this.Data = data; this.Parent = parent;
}
public bool AddItem(T val)
{
if (val.CompareTo(this.Data) == 0)
{
return false;
}
if (val.CompareTo(this.Data) < 0)
{
if (this.Left == null)
{
this.Left = new Node<T>(val, this);
}
else if (this.Left != null)
{
this.Left.AddItem(val);
}
}
else
{
if (this.Right == null)
{
this.Right = new Node<T>(val, this);
}
else if (this.Right != null)
{
this.Right.AddItem(val);
}
}
return true;
}
public int CompareTo(object obj)
{
if (obj is Node<T> item)
{
return Data.CompareTo(item);
}
else
12
{
throw new ArgumentException("Несовпадение типов");
}
}
public int CompareTo(T other)
{
return Data.CompareTo(other);
}
public override string ToString()
{
return Data.ToString();
}
}
class Tree <T>
where T : IComparable, IComparable<T>
{
public Node<T> Root { get; set; } public bool AddItem(T data)
{
if (Root == null)
{
Root = new Node<T>(data); return true;
}
Root.AddItem(data); return true;
return false;
}
public IEnumerable<Node<T>> LevelOrderTraversal()
{
if (Root == null)
{
yield break;
}
var queue = new Queue<Node<T>>(); queue.Enqueue(Root);
while (queue.Count > 0)
{
var node = queue.Dequeue(); yield return node;
if (node.Left != null)
{
queue.Enqueue(node.Left);
}
if (node.Right != null)
{
queue.Enqueue(node.Right);
}
}
}
public void Print()
{
if (Root == null)
{
Console.WriteLine("Дерево пустое");
}
foreach (var item in LevelOrderTraversal())
{
Console.Write(item + ", ");
}
Console.WriteLine();
}
public void Clear()
{
Root = null;
13
}
private Node<T> Searching(Node<T> node, T val)
{
if (node == null) return null; switch (val.CompareTo(node.Data))
{
case 1: return Searching(node.Right, val); case -1: return Searching(node.Left, val); case 0: return node;
default: return null;
}
}
public int[] MaxMin()
{
var Max = this.Root; var Min = this.Root;
while (Max.Right != null)
{
Max = Max.Right;
}
while (Min.Left != null)
{
Min = Min.Left;
}
int[] f = {Convert.ToInt32(Max.Data), Convert.ToInt32(Min.Data)}; return f;
}
public Node<T> Search(T val)
{
return Searching(this.Root, val);
}
public bool RemoveItem(T value)
{
Node<T> node = Search(value); if (node == null)
{
return false;
}
Node<T> cTree;
if (node == this.Root)
{
if (node.Right != null)
{
cTree = node.Right;
}
else
{
cTree = node.Left;
}
while (cTree.Left != null)
{
cTree = cTree.Left;
}
T temp = cTree.Data; this.RemoveItem(temp); node.Data = temp; return true;
}
if (node.Left == null && node.Right == null && this.Root != null)
{
if (node == node.Parent.Left)
{
node.Parent.Left = null;
}
else
14
{
node.Parent.Right = null;
}
return true;
}
if (node.Left != null && node.Right == null)
{
node.Left.Parent = node.Parent; if (node == node.Parent.Left)
{
node.Parent.Left = node.Left;
}
else if (node == node.Parent.Right)
{
node.Parent.Right = node.Left;
}
return true;
}
if (node.Left == null && node.Right != null)
{
node.Right.Parent = node.Parent; if (node == node.Parent.Left)
{
node.Parent.Left = node.Right;
}
else if (node == node.Parent.Right)
{
node.Parent.Right = node.Right;
}
return true;
}
if (node.Left != null && node.Right != null)
{
cTree = node.Right;
while (cTree.Left != null)
{
cTree = cTree.Left;
}
if (cTree.Parent == node)
{
cTree.Left = node.Left; node.Left.Parent = cTree; cTree.Parent = node.Parent; if (node == node.Parent.Left)
{
node.Parent.Left = cTree;
}
else if (node == node.Parent.Right)
{
node.Parent.Right = cTree;
}
return true;
}
else
{
if (cTree.Right != null)
{
cTree.Right.Parent = cTree.Parent;
}
cTree.Parent.Left = cTree.Right; cTree.Right = node.Right; cTree.Left = node.Left; node.Left.Parent = cTree; node.Right.Parent = cTree; cTree.Parent = node.Parent;
15
if (node == node.Parent.Left)
{
node.Parent.Left = cTree;
}
else if (node == node.Parent.Right)
{
node.Parent.Right = cTree;
}
return true;
}
}
return false;
}
}
class Program
{
static void Main(string[] args)
{
var tree = new Tree<int>(); Console.Write("Количесвто элементов дерева - "); int n = int.Parse(Console.ReadLine()); Console.WriteLine();
Console.WriteLine("Введите значения для элементов:"); Console.WriteLine();
for (int i = 0; i < n; i++)
{
int AddNumber = int.Parse(Console.ReadLine()); tree.AddItem(AddNumber);
}
Console.WriteLine();
tree.Print();
Console.WriteLine(); Console.Write("Удалить элемент - ");
int DeleteNumber = int.Parse(Console.ReadLine()); Console.WriteLine(); tree.RemoveItem(DeleteNumber); Console.Write("Дерево после удаления: "); tree.Print();
Console.WriteLine(); int[] arr = tree.MaxMin();
Console.WriteLine($"Максимальное - {arr[0]} \nМинимальное - {arr[1]}"); tree.Clear();
Console.WriteLine();
tree.Print();
}
}
}
16