Составить отчет по лабораторной работе и защитить его у преподавателя
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Лабораторная работа №6 (4 часа). Поиск по дереву с включением и исключением

Цель работы:

 - исследовать и изучить методы поиска элемента в дереве по заданному ключу со вставкой (включением) и удалением (исключением);

 - овладеть умениями и навыками написания на С++ программ поиска по дереву с включением и исключением.


Порядок выполнения работы

 - ознакомиться с краткой теорией и примерами решения задач, относящихся к поиску по дереву с включением и исключением;

 - ответить на контрольные вопросы и получить оценку по знанию теории;

 - получить задание на выполнение конкретного варианта лабораторной работы и выполнить его;

 - написать и отладить программу решения задачи на языке С++;

 - составить отчет по лабораторной работе и защитить его у преподавателя.

 

Содержание отчета по ЛР

- наименование ЛР и ее цель;

 - задание на ЛР согласно варианту;

 - листинг приложения, обеспечивающей успешное решение студентом полученного варианта задачи;

 - результаты работы программы.

 

Краткая теория

В лабораторной работе № 3 были рассмотрены основные понятия, касающиеся сбалансированных бинарных деревьев, и представлены алгоритмы создания и возможных обходов бинарных деревьев. В данной работе будут рассмотрены случаи, когда дерево уже создано и необходимо осуществить поиск элемента по ключу в уже имеющемся бинарном дереве. На практике часто может возникать необходимость вначале осуществить поиск элемента в структуре, а затем, в случае, если элемент найден, либо информировать пользователя об этом, либо удалить его. В случае, если элемент не найден, пользователя необходимо либо об этом проинформировать, либо вставить в структуру элемент с ненайденным ключом.

Поиск по бинарному дереву.

Назначение его в том, чтобы по заданному ключу осуществить поиск узла дерева. Также для вставки элемента в дерево сначала нужно осуществить поиск в дереве по заданному ключу. Если такой ключ имеется, то программа завершается, если нет, то происходит вставка. Длительность операции поиска (число узлов, которые надо перебрать для этой цели) зависит от структуры дерева. Действительно, дерево может быть вырождено в однонаправленный список (иметь единственную ветвь) - такое дерево может возникнуть, если элементы поступали в дерево в порядке возрастания (убывания) их ключей, например:

 В этом случае время поиска будет такое же, как и однонаправленном списке, т.е. в среднем придется перебрать N/2 элементов.

Наибольший эффект использования дерева достигается в том случае, когда дерево "сбалансировано". В этом случае для поиска придется перебрать не более log2N.

Алгоитмы

Процедура поиска по бинарному дереву

Опишем процедуру поиска в псевдокоде. Переменной search будет присваиваться указатель на найденное звено:

p = tree

whlie p <> nil do

   if key = k(p) then

                 search = p

                 return

   endif

   if key < k(p) then

                 p = left(p)

                   else

                 p = right(p)

   endif

endwhile

search = nil

return

 

Включение элемента в дерево

Для включения новой записи в дерево, прежде всего, нужно найти тот узел, к которому можно "подвесить" (присоединить) новый элемент. Алгоритм поиска нужного узла тот же самый, что и при поиске узла с заданным ключом. Этот узел будет найден в тот момент, когда в качестве очередной ссылки, определяющий ветвь дерева, в которое надо продолжить поиск, окажется ссылка NIL.

Однако непосредственно использовать процедуру поиска нельзя, потому что по окончанию вычисления ее значение не фиксирует тот узел, из которого была выбрана ссылка NIL. Модифицируем описание процедуры поиска так, чтобы в качестве ее побочного эффекта фиксировалась ссылка на узел, в котором был найден заданный ключ (в случае успешного поиска), или ссылка на узел, после обработки которого, поиск прекращен (в случае неуспешного поиска).

 

Алгоритм поиска по бинарному дереву с включением (вставкой) в псевдокоде.

p = tree

q = nil

while p <> nil do

q = p

if key = k(p) then

               search = p

               return

endif

   if key < k(p) then

               p = left(p)

                    else

                p = right(p)

endif

endwhile

v = maketree(key, rec)

if q = nil then

             tree = v

           else

         if key < k(q) then

                       left(q) = v

                        else

                       right(q) = v

         endif

endif

search = v

return

   Вспомогательный указатель q здесь отстает на один шаг от рабочего p.

Дата: 2019-12-10, просмотров: 287.