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

Помеченные деревья и деревья выражений

Часто бывает полезным сопоставить каждому узлу дерева метку или значение. Дерево, у которого узлам сопоставлены метки, называется помеченным деревом. Метка узла – это значение, которое «хранится» в узле.

Аналогия: дерево – список, узел – позиция, метка – элемент.

Рассмотрим пример дерева с метками, представляющее арифметическое выражение

(a + b)*(a + c), где n1 , n2 , …, n7 – имена узлов, а метки проставлены рядом с соответствующими узлами. Правила соответствия меток деревьев элементам выражений следующие:

Метка каждого листа соответствует операнду и содержит его значение;

Метка каждого внутреннего (родительского) узла соответствует оператору.

Часто при обходе деревьев составляется список не имен узлов, а их меток. В случае дерева выражений при прямом обходе получим префиксную форму записи выражения, где оператор предшествует обоим операндам. В примере получим префиксное выражение вида: *+ ab + ac .

Обратный обход меток дерева дает постфиксное представление выражения (польскую запись). Обратный обход нашего дерева даст нам следующую запись выражения: ab + ac +*.

Префиксная и постфиксная запись выражения не требует скобок.

При симметричном обходе получим обычную инфиксную запись выражения: a + b * a + c . Для инфиксной записи выражений характерно заключение в скобки: ( a + b )*( a + c ).

Реализация деревьев

Пусть дерево T имеет узлы 1, 2, …., n . Cамым простым представлением дерева T будет линейный массив A , где каждый элемент A [ i ] содержит номер родительского узла (является курсором на родителя). Поскольку корень дерева не имеет родителя, то его курсор будет равен 0.

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

Пример.

Для приведенного на рисунке дерева построим линейный массив по следующему правилу: A [ i ]= j , если узел j является родителем узла i , A [ i ]=0, если узел i является корнем. Тогда массив будет выглядеть следующим образом:

Другой важный и полезный способ представления деревьев состоит в формировании для каждого узла списка его потомков. Рассмотрим этот способ для приведенного выше примера.

Двоичные деревья

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

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

Обход двоичных деревьев в прямом и обратном порядке в точности соответствует таким же обходам обычных деревьев. При симметричном обходе двоичного дерева с корнем n левым поддеревом T1 и правым поддеревом T2 сначала проходится поддерево T, затем корень n и далее поддерево T2 .

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