
- •Оглавление
- •Бинарные деревья
- •Основные понятия и определения.
- •Основные операции с бинарными деревьями Узел бинарного дерева
- •Обход бинарного дерева.
- •Упорядоченные деревья. Включение нового узла, поиск по дереву с включением
- •Упорядоченные деревья. Поиск заданного значения.
- •Удаление бинарного дерева.
- •Удаление узла из упорядоченного дерева
- •Пример использования упорядоченного бинарного дерева для частотного анализа данных
Пример использования упорядоченного бинарного дерева для частотного анализа данных
В качестве примера использования упорядоченного бинарного дерева рассмотрим построение частотного распределения целых чисел. Эта задача возникает при анализе данных, когда необходимо определить, сколько и какое число встретилось раз, т.е. определить частоту появления каждого числа.
Решение заключается в следующем. Создадим упорядоченное бинарное дерево, которое будет содержать числа. Если число встретилось первый раз, то добавляется новый узел с соответствующим значением. Если такое число уже есть в дереве, то увеличивается счетчик появления этого числа, хранящийся в этом узле. Поэтому внесем некоторые изменения в описание узла дерева Tree, добавив новое целочисленное полеcnt, которое будет являться счетчиком повторений. В основе алгоритма лежит процедураInsert(), осуществляющая поиск места вставки и добавляющая новый узел в упорядоченное бинарное дерево. Однако теперь в ней требуется дополнительная проверка на наличие в дереве значения. В остальном процедураInsert() аналогична процедуре описанной выше.
programtestTree;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
PTree = ^Tree;
Tree = record
inf,cnt:integer;// полеcnt– счетчик числа повторений
left, right: PTree;
end;
var
root:PTree; // указатель на корень дерева
n: integer;
procedure Insert (var r: PTree; x: integer); // Процедура поиска и добавления узла
var
p: PTree;
begin
if r = nil then
begin{Дерево пусто или нашли место добавления}
new(r);{Создаем и заполняем узел}
r^.inf := x;
r^.cnt:= 1;{Счетчик повторений устанавливаем в единицу }
r^.left := nil;
r^.right := nil;
end
else if x < r^.inf then
Insert(r^.left,x) // Продолжение поиска в лев. поддереве
else if x > r^.inf then
Insert(r^.right,x) // Продолжение поиска в прав. поддереве
else
r^.cnt:=r^.cnt+ 1; { нашли узел со значением равным Х – увеличиваем счетчикcntна единицу}
end; {Insert}
procedure PrintTree (r: PTree); {Обход и вывод дерева на экран(InOrder)}
begin
if r <> nil then
begin
PrintTree(r^.left);
writeln(' ', r^.inf : 4, ' ', r^.cnt : 4);
PrintTree(r^.right);
end; {if}
end; {PrintTree}
procedure DeleteTree (r: PTree); {Удаление дерева}
begin
if r <> nil then
begin
DeleteTree (r^.left);
DeleteTree (r^.right);
dispose(r);
end;
end; { DeleteTree }
begin {main program}
root:=nil; {Инициализация структуры дерева }
writeln('Inputintegers; 777-exit');
repeat{Читаем числа с клавиатуры до ввода числа 777 и добавляем в дерево}
write('> ');
readln(n);
Insert(root, n);
until n = 777;
Writeln('Tree sorted contents :');
Writeln(' Value Count');
PrintTree(root); {Печатаем содержимое дерева на экране, сортировка - по возрастанию значения ключаinf}
DeleteTree(root); {Удаляем структуру дерева и освобождаем память}
readln;
end.
Задачи
Проверить, является ли данное двоичное дерево деревом поиска.
Дан текстовый файл. Определить частоту использования каждого слова в тексте. Результаты вывести в алфавитном порядке (слово - сколько раз встретилось). Найти наиболее и наименее встречающиеся слова.
Подсчитать число узлов в заданном двоичном дереве.
В бинарном дереве хранятся целые числа, определить их среднее значение.
Дан текстовый файл с целыми числами. Распечатать числа по убыванию. (Использовать бинарное дерево).
Даны два текстовых файла А и Б. Занести в файл С те слова, которых нет в файле В. Для хранения слов из файла В и ускорения поиска воспользуйтесь деревом двоичного поиска.
Даны два текстовых файла А и Б. Занести в файл С те слова, которых есть и в файле А и в файле В.
Описать логическую функцию, проверяющую на равенство два заданных двоичных дерева.
Описать логическую функцию, проверяющую, есть ли в заданном двоичном дереве хотя бы два одинаковых элемента.
Определить сколько раз встречается в упорядоченном бинарном дереве максимальное значение.