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

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

.odt
Скачиваний:
0
Добавлен:
23.02.2026
Размер:
362.7 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования

«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

Кафедра безопасности информационных систем (БИС)

БИНАРНЫЕ ДЕРЕВЬЯ ПОИСКА Отчет по практической работе №5 по дисциплине «Структуры данных»

Студент гр.

________

__.__.2025

Принял

Преподаватель

кафедры КИБЭВС

________ Е.Е. Лунева

__.__.2025

Задание

Реализовать бинарное дерево поиска при помощи динамических структур (классы). Предусмотреть следующие интерфейсные методы:

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

  • Добавление элемента в дерево bool AddItem( int a) - возвращает true, если добавление прошло успешно, иначе false. Например, если такой элемент уже был в дереве - то метод вернет false.

  • Удаление элемента из дерева.  bool RemoveItem(int a)

  • Очистка дерева void Clear()

  • Вывод дерева (используйте поиск в ширину) void Print() или string Print()

    Вариант 1. Реализуйте метод, находящий самый большой элемент в дереве.

Оглавление

Задание 2

Введение 4

1 ХОД РАБОТЫ 5

Заключение 11

Приложение А 12

    Введение

Целью данной работы является реализация бинарного дерева поиска с использованием динамических структур (классов).

    1 ХОД РАБОТЫ

AddItem: Добавляет элемент в дерево. Если дерево пустое, элемент становится корнем, иначе вызывается рекурсивная вставка (рис. 1)

Рисунок 1 — AddItem

AddItemRecursive: Рекурсивно находит место для нового элемента, перемещаясь влево или вправо по дереву, в зависимости от значения элемента (рис. 2)

Рисунок 2 — AddRecursive

RemoveItem: Удаляет элемент из дерева. Вызывает рекурсивную функцию для поиска и удаления узла с заданным значением (рис. 3)

Рисунок 3 — RemoveItem

RemoveItemRecursive: Рекурсивно ищет элемент для удаления, перестраивая дерево в зависимости от наличия потомков у удаляемого узла (рис. 4)

Р исунок 4 — RemoveItemRecursive

Clear: Очищает дерево, удаляя все узлы, сбрасывая корень дерева (рис. 5)

Рисунок 5 — Clear

Print: Выводит элементы дерева в ширину, начиная с корневого узла и проходя по уровням дерева (рис. 6)

Рисунок 6 — Print

FindMaxRecursive: находит самый большой элемент в бинарном дереве поиска, последовательно перемещаясь по правым потомкам до достижения крайнего правого узла. (рис. 7)

Рисунок 7 — FindMaxRecursive

Текстовое описание реализации удаления элемента из дерева:

Функция удаления элемента в бинарном дереве начинается с поиска узла, который нужно удалить. Если узел найден, есть несколько вариантов. Если узел — это лист (у него нет потомков), его просто удаляют. Если у узла есть один потомок (левый или правый), узел заменяется этим потомком. Если у узла два потомка, находят наименьший элемент в правом поддереве (наименьший элемент больше удаляемого узла), копируют его значение в узел, который нужно удалить, а затем удаляют этот минимальный узел. После выполнения этих действий дерево остаётся упорядоченным (рис. 9,10,11)

Р исунок 9 — Удаление листа

Р исунок 10 — Удаление с 1 поддеревом

Р исунок 11 — Удаление с 2 поддеревьями

Заключение

В ходе работы было создано бинарное дерево поиска с поддержкой основных операций: добавление, удаление, очистка, вывод, поиск максимального элемента дерева.

Приложение А

(обязательное)

Код программы

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;

}

else

{

return AddItemRecursive(node.Left, a);

}

}

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;

}

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

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());

// Поиск максимального элемента

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);

}

}

}

Томск 2025

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