Минобрнауки России
Санкт-петербургский государственный
Электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
Отчёт
Лабораторная работа №3
По дисциплине «АиСД»
Тема: деревья
Студент гр. 3316  | 
		
  | 
		Руденский И.М.  | 
	
Преподаватель  | 
		
  | 
		Манирагена Валенс  | 
	
Санкт-Петербург
2024
Постановка задачи
Цель работы: исследование алгоритмов для работы с двоичным деревом.
Задание на обработку:
18  | 
		Двоичное  | 
		Ширинная  | 
		Внутренний  | 
		Количество вершин на самом нижнем уровне  | 
	
Обоснование выбора представления в памяти:
1) Дерево строится динамически, и узлы добавляются по мере необходимости.
Не требуется заранее резервировать память для фиксированного количества элементов, это особенно важно для структур, где размер заранее неизвестен.
2) Указатели позволяют эффективно связать узлы:
Каждый узел знает о своих потомках через указатели left и right, связи между узлами интуитивны и легко поддерживаются.
3) Универсальность структуры: можно представить любые виды двоичных деревьев: двоичное дерево поиска, двоичное дерево с балансировкой, полное двоичное дерево и т.д.
4) Читаемость и модульность кода:
Разделение логики узлов и самого дерева упрощает реализацию. Логика вставки, обхода, разметки находится в классе BinaryTree, что делает её легко расширяемой.
5) Эффективное использование памяти: каждый узел хранит только свои данные и два указателя. Нет дополнительных структур, которые могли бы увеличивать накладные расходы.
Ход работы
1) Пример со случайными числами:
2) Пример со вводом с клавиатуры:
Таблица сложностей алгоритмов:
Операция  | 
			Временная сложность  | 
		||
Добавление узла (insert)  | 
			O(log n) — лучший случай O(n) — худший случай  | 
		||
Генерация дерева  | 
			O(n log n) — лучший случай O(n^2) — худший случай  | 
		||
Внутренний обход  | 
			
				
 
 
 
  | 
		||
Ширинный обход  | 
			
				
 
 
 
  | 
		||
Печать дерева  | 
			
				
 
 
 
  | 
		||
Разметка дерева (ширинная)  | 
			
				
 
 
 
  | 
		||
Подсчёт узлов на нижнем уровне  | 
			
				
 
 
 
  | 
		
Выводы о результатах испытания алгоритмов
В результате испытаний алгоритмы обхода деревьев показали свою эффективность для выполнения задач поиска, сортировки и обработки узлов. Внутренний обход (in-order) доказал свою полезность при работе с бинарными деревьями поиска, так как он позволяет обойти узлы в отсортированном порядке. Ширинный обход (по уровням) оказался удобен для задач визуализации и обработки узлов в порядке их удаления от корня. Алгоритмы имеют линейную временную сложность относительно числа узлов, что подтверждает их пригодность для работы с деревьями большого размера. Использование рекурсивных методов для обхода в глубину обеспечивает лаконичность кода, однако может приводить к увеличению расхода памяти при работе с глубоко вложенными деревьями.
