- •2. Двоичные деревья
- •Inf : Elem;
- •3. Основные операции с двоичными деревьями
- •Inf_s : Tree;
- •Var p:Stack;
- •Var p:Stack;
- •Var start : Stack; flag : boolean;
- •Var I : integer;
- •Var m : integer;
- •Var k : integer;
- •4. Дерево поиска ( сортировки )
- •Inf : integer;
- •Var X : integer; Root : Tree;
- •Var flag : boolean;
- •InTree(Root,X)
- •Var q : Tree;
- •Var q : Tree;
- •Var s: Tree;
- •5. Сбалансированные деревья
- •Var p : Tree;
- •Var I : integer;
Var k : integer;
begin
if T=nil then COUNT:=0
else
begin
if T^.inf = El then k:=1 else k:=0;
COUNT:=k+COUNT(T^.L,El)+COUNT(T^.R,El)
end
end; { COUNT }
function Double(T : Tree) : boolean;
begin
if T=nil then Double:=false
else
begin
if COUNT(T,T^.inf) > 1 then Double:=true
else
Double:= Double(T^.L) or Double(T^.R)
end
end; { Double }
Пример 3.9. Описать функцию Equal проверки на равенство двух двоичных деревьев одинаковой структуры.
function Equal(T1,T2 : Tree ) : boolean;
begin
if T1=T2 then Equal:=true
else
if (T1 <> nil) and (T2 <> nil) then
if T1^.inf = T2^.inf then
Equal:=Equal(T1^.L,T2^.L) and
Equal(T1^.R,T2^.R)
else Equal:=false
else Equal:=false
end; { Equal }
Пример 3.10. Описать процедуру Copy, которая создает копию T2 дерева T1.
procedure Copy(T1 : Tree; var T2 : Tree);
begin
if T1 = nil then T2:=nil
else
begin
new(T2); T2^.inf:=T1^.inf;
Copy(T1^.L,T2^.L);
Copy(T1^.R,T2^.R);
end
end; { Copy }
Упражнение 3.2. Описать нерекурсивную процедуру или функцию, которая возвращает элемент из самого левого (правого) листа непустого дерева.
Упражнение 3.3. Описать нерекурсивную процедуру или функцию, которая
а) определяет количество узлов дерева;
б) вычисляет сумму (произведение, среднее арифметическое ) всех элементов дерева.
в) определяет число вхождений заданного элемента в дерево;
г) выдает элементы из всех листьев дерева.
Упражнение 3.4. Описать рекурсивную процедуру или функцию, которая
а) определяет количество узлов (листьев, внутренних узлов) дерева;
б) вычисляет сумму (произведение, среднее арифметическое) всех элементов дерева.
в) определяет, входит ли заданный элемент в дерево;
г) выдает элементы из всех листьев (внутренних узлов) дерева;
д) определяет глубину непустого дерева;
е) определяет количество узлов на заданном уровне;
ж) удаляет листья дерева со значениями, равными заданному.
4. Дерево поиска ( сортировки )
Двоичные деревья могут использоваться для представления множества данных, в котором идет поиск элементов по уникальному значению или ключу. Если дерево организовано так, что для каждой вершины все ключи левого поддерева меньше ее ключа, а ключи правого поддерева больше его, то такое дерево называется деревом поиска или деревом сортировки ( рисунок 6 ).
4.1 Построение дерева поиска
Алгоритм создания дерева поиска основан на следующих правилах :
Если новый элемент меньше, чем значение в узле, то он должен добавляться в левое поддерево, если больше, то в правое.
Если в дереве есть узел с таким значением, то возможны варианты :
а) новый узел добавляется в правое поддерево,
б) новый узел добавляется в левое поддерево,
в) добавление не происходит.
Инфиксный обход такого дерева дает упорядоченную по возрастанию (неубыванию в случае добавления одинаковых элементов ) последовательность.
Пример 4.1. Упорядочить по неубыванию последовательность целых чисел, которая вводится из текстового файла.
program UP;
type Tree = ^Node;
Node = record