Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
attachments_03-09-2012_10-20-12 / Бинарные деревья - дерево бинарного поиска.doc
Скачиваний:
71
Добавлен:
21.05.2015
Размер:
121.86 Кб
Скачать

Пример использования упорядоченного бинарного дерева для частотного анализа данных

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

Решение заключается в следующем. Создадим упорядоченное бинарное дерево, которое будет содержать числа. Если число встретилось первый раз, то добавляется новый узел с соответствующим значением. Если такое число уже есть в дереве, то увеличивается счетчик появления этого числа, хранящийся в этом узле. Поэтому внесем некоторые изменения в описание узла дерева 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.

Задачи

  1. Проверить, является ли данное двоичное дерево деревом поиска.

  2. Дан текстовый файл. Определить частоту использования каждого слова в тексте. Результаты вывести в алфавитном порядке (слово - сколько раз встретилось). Найти наиболее и наименее встречающиеся слова.

  3. Подсчитать число узлов в заданном двоичном дереве.

  4. В бинарном дереве хранятся целые числа, определить их среднее значение.

  5. Дан текстовый файл с целыми числами. Распечатать числа по убыванию. (Использовать бинарное дерево).

  6. Даны два текстовых файла А и Б. Занести в файл С те слова, которых нет в файле В. Для хранения слов из файла В и ускорения поиска воспользуйтесь деревом двоичного поиска.

  7. Даны два текстовых файла А и Б. Занести в файл С те слова, которых есть и в файле А и в файле В.

  8. Описать логическую функцию, проверяющую на равенство два заданных двоичных дерева.

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

  10. Определить сколько раз встречается в упорядоченном бинарном дереве максимальное значение.