АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Представление бинарных деревьев

Читайте также:
  1. VI. Представление результатов исследования
  2. АКТУАЛЬНЫЕ АСПЕКТЫ ПАТОГЕНЕЗА ВОСПАЛЕНИЯ. СОВРЕМЕННОЕ ПРЕДСТАВЛЕНИЕ О ПАТОГЕНЕЗЕ СЕПСИСА И СИНДРОМА СИСТЕМНОГО ВОСПАЛИТЕЛЬНОГО ОТВЕТА
  3. Анализ методом деревьев событий и отказов
  4. Арифметическое представление пространства и времени
  5. Бухгалтерский баланс как типовое представление объекта исследования
  6. Визуальное представление звуков.
  7. Вопрос 1. Общее представление об информации. Виды и свойства информации. Математические основы информатики.
  8. Г – представлением.
  9. Ганнушкин, Шелдон и др.). Представление об акцентуациях личности.
  10. Гауссовское представление.
  11. Глава 1. Общее представление о народной культуре и проблемах ее исследования
  12. Глава 9. Представление 1 страница

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

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

Рис.4.4. Представление бинарного дерева в виде списковой структуры

 

Приведем пример программы, которая осуществляет создание и редактирование бинарного дерева, представленного в виде списковой структуры

program bin_tree_edit;

type node=record

name: string;

left, right: pointer;

end;

var

n:integer;

pnt_s,current_s,root: pointer;

pnt,current:^node;

s: string;

procedure node_search (pnt_s:pointer; var current_s:pointer);

{Поиск узла по содержимому}

var

pnt_n:^node;

begin

pnt_n:=pnt_s; writeln(pnt_n^.name);

if not (pnt_n^.name=s) then

begin

if pnt_n^.left <> nil then

node_search (pnt_n^.left,current_s);

if pnt_n^.right <> nil then

node_search (pnt_n^.right,current_s);

end

else current_s:=pnt_n;

end;

procedure node_list (pnt_s:pointer);

{Вывод списка всех узлов дерева}

var

pnt_n:^node;

begin

pnt_n:=pnt_s; writeln(pnt_n^.name);

if pnt_n^.left <> nil then node_list (pnt_n^.left);

if pnt_n^.right <> nil then node_list (pnt_n^.right);

end;

procedure node_dispose (pnt_s:pointer);

{Удаление узла и всех его потомков в дереве}

var

pnt_n:^node;

begin

if pnt_s <> nil then

begin

pnt_n:=pnt_s; writeln(pnt_n^.name);

if pnt_n^.left <> nil then

node_dispose (pnt_n^.left);

if pnt_n^.right <> nil then

node_dispose (pnt_n^.right);

dispose(pnt_n);

end

end;

begin

new(current);root:=current;

current^.name:='root';

current^.left:=nil;

current^.right:=nil;

repeat

writeln('текущий узел -',current^.name);

writeln('1-присвоить имя левому потомоку');

writeln('2-присвоить имя правому потомку');

writeln('3-сделать узел текущим');

writeln('4-вывести список всех узлов');

writeln('5-удалить потомков текущего узла');

read(n);

if n=1 then

begin {Создание левого потомка}

if current^.left= nil then new(pnt)

else pnt:= current^.left;

writeln('left?');

readln;

read(s);

pnt^.name:=s;

pnt^.left:=nil;

pnt^.right:=nil;

current^.left:= pnt;

end;

if n=2 then

begin {Создание правого потомка}

if current^.right= nil then new(pnt)

else pnt:= current^.right;

writeln('right?');

readln;

read(s);

pnt^.name:=s;

pnt^.left:=nil;

pnt^.right:=nil;

current^.right:= pnt;

end;

if n=3 then

begin {Поиск узла}

writeln('name?');

readln;

read(s);

current_s:=nil; pnt_s:=root;

node_search (pnt_s, current_s);

if current_s <> nil then current:=current_s;

end;

if n=4 then

begin {Вывод списка узлов}

pnt_s:=root;

node_list(pnt_s);

end;

if n=5 then

begin {Удаление поддерева}

writeln('l,r?');

readln;

read(s);

if (s='l') then

begin {Удаление левого поддерева}

pnt_s:=current^.left;

current^.left:=nil;

node_dispose(pnt_s);

end

else

begin {Удаление правого поддерева}

pnt_s:=current^.right;

current^.right:=nil;

node_dispose(pnt_s);

end;

end;

until n=0

end.

 

В виде массива проще всего представляется полное бинарное дерево, так как оно всегда имеет строго определенное число вершин на каждом уровне. Вершины можно пронумеровать слева направо последовательно по уровням и использовать эти номера в качестве индексов в одномерном массиве.

Рис.4.5. Представление бинарного дерева в виде массива

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

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

адрес = 2к-1+i-1,

где k-номер уровня вершины, i- номер на уровне k в полном бинарном дереве. Адрес корня будет равен единице. Для любой вершины можно вычислить адреса левого и правого потомков

адрес_L = 2к+2(i-1)

адрес_R = 2к+2(i-1)+1

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


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.011 сек.)