Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты оаип.docx
Скачиваний:
18
Добавлен:
27.09.2019
Размер:
161.68 Кб
Скачать

2. Бинарные деревья, их создание. Способы обхода дерева.

Бинарное (двоичное) дерево (binary tree) - это упорядоченное дерево, каждая вершина которого имеет не более двух поддеревьев, причем для каждого узла выполняется правило: в левом поддереве содержатся только ключи, имеющие значения, меньшие, чем значение данного узла, а в правом поддереве содержатся только ключи, имеющие значения, большие, чем значение данного узла.

Бинарное дерево является рекурсивной структурой, поскольку каждое его поддерево само является бинарным деревом и, следовательно, каждый его узел в свою очередь является корнем дерева.

Узел дерева, не имеющий потомков, называется листом.

Бинарное дерево может представлять собой пустое множество.

Функция, выполняющая обход дерева, позволяет перебрать все элементы, содержащиеся в дереве.

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

Например, нерекурсивная функция для обхода дерева может выглядеть так:

template<class T>

void walkNotRec(TNode<T>* tree) {

if (tree) {

TNode<T> temp;

TNode<T>* ptemp = &temp;

TNode<T>* p = ptemp, *c = tree, *w;

while (c != ptemp) {

cout << c->value;

w = c->pleft;

c->pleft = c->pright;

if(c == p)

c->pright = 0;

else

c->pright = p;

p = c;

if (w) c = w;

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

Билет № 29

1.Односвязные линейные списки и операции над ними.

Линейный список — это динамическая структура данных, каждый элемент которой посредством указателя связывается со следующим элементом.

Каждый элемент списка содержит поле данных (Data) (оно может иметь сложную структуру) и поле ссылки на следующий элемент (next). Поле ссылки последнего элемента должно содержать пустой указатель (NULL).

Так как ссылка всего одна (только на следующий элемент), то такой список является односвязным.

Когда говорят о линейном списке, то, как правило, подразумевают именно односвязный список.

Действия со сформированным списком

Сформировав начальный список, можно выполнять с ним различные действия. Настоятельно рекомендуется каждую операцию со списком оформлять в виде отдельной функции. Такой подход заметно упрощает разработку программы и возможную её дальнейшую модификацию. Понятно, что и только что рассмотренное формирование начального списка также лучше записать в виде функции.

Просмотр списка — осуществляется последовательно, начиная с его начала. Указатель последовательно ссылается на первый, второй, и т.д. элементы списка до тех пор, пока весь список не будет пройден.

Поиск первого вхождения в список элемента, соответствующего заданным требованиям:

  • Добавление нового элемента в начало списка

  • Вставка нового элемента в произвольное место списка по какому-нибудь принципу, например, вставка в отсортированный по возрастанию список

  • Удаление элемента из линейного списка

  • Удаление (очистка) всего списка

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]