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

Практика 5 - Бинарное дерево поиска - СФ

.pdf
Скачиваний:
10
Добавлен:
06.11.2022
Размер:
462.49 Кб
Скачать

3Заключение

Врезультате практической работы были получены навыки с деревьями,

удаление, добавление элементов, вывод деревьев на консоль, также был написан

метод реализации варианта.

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