Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бинарное дерево.doc
Скачиваний:
57
Добавлен:
09.02.2015
Размер:
469.5 Кб
Скачать

Способы изображения древовидной структуры

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

1) Первый способ, и наиболее распространенный – Классическая диаграмма (см. рисунок 2).

Рисунок 2 – Классическая диаграмма

2) Вложенные скобки. Легко реализуется на языках программирования, но неудобен для восприятия (см. Рисунок 3).

(A(B(E,F(I,J)),C(G),D(H)))

Рисунок 3 - Вложенные скобки

3) Вложенные множества. Данный способ наглядный и удобный для восприятия, но возможны проблемы с его реализацией (см. Рисунок 4).

Рисунок 4 - Вложенные множества

4) Ломаная последовательность (см. Рисунок 5).

Рисунок 5 - Ломаная последовательность

Двоичное (бинарное) дерево

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

То есть двоичное дерево либо является пустым, либо состоит из данных и двух поддеревьев (каждое из которых может быть пустым). Очевидным, но важным для понимания фактом является то, что каждое поддерево в свою очередь тоже является деревом. Если у некоторого узла оба поддерева пустые, то он называется листовым узлом (листовой вершиной).

Например, согласно этой грамматике, двоичное дерево можно было бы записать так (см. Рисунок 6):

Рисунок 6 - Двоичное дерево

Двоичное дерево поиска

Деревья двоичного поиска широко распространены в программировании. Значение содержимого каждой вершины дерева двоичного поиска:

1) Оба поддерева — левое и правое, являются двоичными деревьями поиска.

2) У всех узлов левого поддерева произвольного узла X значения ключей данных меньше, нежели значение ключа данных узла X.

3) У всех узлов правого поддерева произвольного узла X значения ключей данных больше, нежели значение ключа данных узла X.

Распространенность деревьев двоичного поиска в программировании является следствием эффективности методов поиска в этих деревьях.

Рисунок 7 - Двоичное дерево поиска

Разработка программного комплекса. Описание алгоритмов, используемых в программном комплексе

После анализа предметной области было решено использовать следующие языковые средства C++ для решения поставленной задачи:

  1. Для хранения вершин дерева с описанием связей – структуры. Структуры в С++ используются для логического и физического объединения данных произвольных типов, так же как массивы служат для группирования данных одного типа.

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

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

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

Более подробная реализация алгоритма будет представлена в следующих разделах данной работы.