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

ЛР3_Шакиров_Айдар_МО-217

.docx
Скачиваний:
16
Добавлен:
31.03.2021
Размер:
144.76 Кб
Скачать

ФГБОУ ВО

Уфимский Государственный Авиационный Технический Университет

Кафедра ВМиК

Отчет по лабораторной работе №3

«Работа с идеально сбалансированным деревом»

по дисциплине

«Структуры и алгоритмы компьютерной обработки данных»

Выполнил:

студент группы МО-217

Шакиров Айдар Рушанович

Проверила:

Канд. техн. наук, доцент

Верхотурова Галина Николаевна

Уфа 2020

Постановка задачи:

Задана последовательность 26 двузначных чисел. Составить идеально сбалансированное дерево и вывести обратным методом обхода (левое-правое-корень).

Теория:

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

Алгоритм добавления новых элементов в идеально сбалансированное дерево

  1. Присваиваем количеству элементов левого поддерева значение половины от количества всех элементов.

  2. Если количество элементов левого поддерева больше нуля, то

    1. Рекурсивно вызывается алгоритм для левого поддерева.

  3. Присваиваем количеству элементов правого поддерева значение количества всех элементов за вычетом количества элементов левого поддерева и единицы.

  4. Если количество элементов правого поддерева больше нуля, то

    1. Рекурсивно вызывается алгоритм для правого поддерева.

  5. Присваиваем текущему элементу добавляемый элемент.

Реализация алгоритма добавления

public Tree Add(int value, int count)

O(n)

{

int nl = count / 2;

O(n)

if (nl > 0)

tree.Left = this.Add(value, nl);

int nr = count - nl - 1;

O(n)

if (nr > 0)

tree.Right = this.Add(value, nr);

this.Data = value;

}

где

  • nl – количество элементов левого поддерева.

  • nr – количество элементов правого поддерева.

  • Value – добавляемый элемент

Алгоритм обратного обхода

  1. Если левое поддерево текущего узла не равно null, то

    1. Рекурсивно вызывается алгоритм для левого поддерева.

  2. Если правое поддерево текущего узла не равно null, то

    1. Рекурсивно вызывается алгоритм для правого поддерева.

  3. Отображается значение узла.

Реализация алгоритма обратного обхода

public string Output(ref string str)

{

O(n)

if (this.Left != null)

O(n)

Left.Output(ref str);

O(n)

if (this.Right != null)

Right.Output(ref str);

s += this.Data.ToString() + ", ";

return s;

}

где

  • str – строка, содержащая последовательность чисел обратного обхода

Входные данные:

  • numbers[] – массив двузначных чисел.

Выходные данные:

  • tree – идеально сбалансированное дерево.

Оценка сложности:

Сложность алгоритма добавления новых элементов в идеально сбалансированное дерево равна O(N).

Сложность алгоритма обратного обхода равна O(N).

Результат:

Список литературы:

  1. Вирт, Н. Алгоритмы и структуры данных. Новая версия для

Оберона : учебное пособие / Н. Вирт. — Москва : ДМК Пресс, 2010 — 272 с.