Автор работы: Пользователь скрыл имя, 14 Ноября 2010 в 19:02, курсовая работа
В данной курсовой работе разработана программа для работы с бинарным упорядоченным деревом. Программа была создана в среде Borland Delphi 7.
ПОСТАНОВКА ЗАДАЧИ
Написать программу создания, вывода и обработки бинарного дерева Т, которая выполняет следующие функции:
а) определяет, есть ли в дереве Т хотя бы два одинаковых элемента;
б) находит в дереве Т длину (число ветвей) пути от корня до ближайшей вершины с элементом Е, если Е не входит в Т, за ответ принять 1.
ВВЕДЕНИЕ……………………………………………………………………….3
ПОСТАНОВКА ЗАДАЧИ……………………………………………………….4
РАЗДЕЛ 1
Общие сведения о бинарных деревьях……………………………………..5
РАЗДЕЛ 2
Алгоритмическая часть…………………………………………………….11
РАЗДЕЛ 3
Техническое задание……………………………………………………….16
РАЗДЕЛ 4
Описание программы
3.1.Описание программного обеспечения……………………………...17
3.1.Описание интерфейса программы…………………………………..25
ВЫВОДЫ………………………………………………………………………..26
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ……………………………27
ПРИЛОЖЕНИЕ А………………………………………………………………28
Необходимо различать три
1.Узла с ключем, равным х, нет.
2.Узел с ключем, равным х, имеет не более одного потомка.
3.Узел с ключем,
равным х, имеет двух потомков
Вспомогательная
рекурсивная процедура Delete вызывается
только в случае, когда удаляемый узел
имеет двух потомков. Она “спускается
вдоль” самой правой ветви левого поддерева
удаляемого узла q^ (при вызове процедуры
ей передается в качестве параметра указатель
на левое поддерево) и, затем, заменяет
существенную информацию (в нашем случае
ключ data) в q^ соответствующим значением
самого правого узла r^ этого левого поддерева,
после чего от r^ можно освободиться.
Рис. 4.1.2.
«Блок-схема вспомогательной процедуры
Delete»
Prosmotr
– рекурсивная процедура, которая используя
компонент TTreeView выводит дерево на экран,
сначала корень, затем левого и правого
потомков.
Check–
проверка дерева на наличие одинаковых
элементов. В теле данной подпрограммы
находится рекурсивная функция Recording,
которая записывает все элементы дерева
в строчку, обходя его в симметричном порядке.
Главная функция ищет одинаковые элементы
следующим образом: копирует первый элемент,
затем ищет подобный в строке, а потом
делает вывод относительно наличия одинаковых
элементов.
Рис. 4.1.4. «Блок-схема
функции Recording, записывающей все элементы
дерева в строку»
Рис. 4.1.5. «Блок-схема функции Check, которая проверяет дерево на наличие одинаковых элементов»
Find
– определение длины пути от корня до
ближайшей заданной вершины. По сути, это
функция поиска заданного элемента, которая
при каждом переходе на следующий уровень
увеличивает счетчик на 1. Значение счетчика
в конце поиска – это и есть искомая длина
пути.
Рис. 4.1.6 «Блок-схема
функции Find, которая находит длину
пути от корня до заданной вершины»
Destroy – удаление дерева. Обходя дерево в прямом порядке, удаляет элементы. Сначала удаляются потомки узла, затем сам узел.
Код
программы находится в
4.2.Описание
интерфейса программы
Рис. 4.2.1 «Рабочее окно программы»
При
запуске программы пользователь
увидит форму с полем для просмотра
дерева и кнопками для работы с
ним (Рис. 3.2.1). Создать дерево можно с помощью
кнопки «Добавить элемент в дерево», первоначально
выбрав в выпадающем списке значение элемента,
который вы хотите добавить. Нажатие на
кнопку «Удалить элемент» приведет к удалению
элемента, который введен в соответствующей
строке ввода. При нажатии на кнопку «Поиск»
программа будет выдавать длину пути от
корня до ближайшей вершины, значение
которой следует первоначально ввести
в строку ввода рядом с кнопкой. При нажатии
на кнопку «Проверка» программа ищет в
дереве одинаковые элементы. В левом окне
отображается дерево и все манипуляции
с ним.
ВЫВОДЫ
В данной курсовой работе была создана программа в среде Delphi 7, которая позволяет создавать бинарное дерево и выполнять с ним следующие операции: добавлять и удалять элементы из дерева, проверять дерево на наличие одинаковых элементов, а также находить длину пути от корня до заданной вершины. Были описаны алгоритмы выполнения этих операций, а также составлены их блок-схемы. Для решения этой задачи была прочитана соответствующая литература. Я приобрела опыт в работе с компонентами среды Delphi, и познакомилась с некоторыми приемами программирования.
СПИСОК
ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1. Ахо А.А., Хопкрофт Д.Э., Ульман Д.Д. Структуры данных и алгоритмы. М.: Вильямс, 2000.
2. Беллман
Р. Динамическое программирование. M. ИЛ,
1960.
3. Бежанова М.М, Москвина Л.А.. Практическое програмирование. Приемы создания программ на языке Паскаль. М..Научный Мир. 2000. – 270 с.
4. Баженова И.Ю.Delphi7. Самоучитель для программиста.М.2003.
5.Вирт Н. Алгоритмы и структуры данных .Пер. с англ. — М.: Мир, 1989. - 360 с., ил.
6.Вирт Н. Алгоритмы + структуры данных = программы. – М.:Мир, 1985.
Гнучих Л.А., Литвиненко Є.М., Мерлак О.В. Моделі та структури даних. Частина І Структури даних: Навчально – методичний посібник. – Х.:ХДТУБА, 2006. – 78 с.
7.Поляков Д.Б., Круглов И.Ю. Программирование в среде Турбо Паскаль.: Справ. – метод. пособие. – М.: Изд-во МАИ, 1992. – 576 с.
8.Конспект по дисциплине «Модели и структуры данных».
9. Конспект по дисциплине «Информатика».
10.Информация с Веб-сайта http://www.lib.csu.ru.
11.
Информация с Веб-сайта http://algolist.manual.ru/
ПРИЛОЖЕНИЕ А
Код программы
unit Kursovaya; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls,
Buttons; type TInfo = Integer; PItem = ^Item; Item = Record Key: TInfo; Left, Right: PItem; end; TForm1 = class(TForm) TreeView: TTreeView; ButtonOfAdd: TButton; ComboBoxOfAdd: TComboBox; ButtonOfDel: TButton; EditOfDel: TEdit; ButtonOfCheck: TButton; EditOfCheck: TEdit; ButtonOfExit: TBitBtn; ButtonOfFind: TButton; EditOfFind: TEdit; procedure ButtonOfAddClick(Sender: TObject); procedure
Prosmotr(P:PItem;Item: procedure ButtonOfDelClick(Sender: TObject); procedure ButtonOfCheckClick(Sender: TObject); procedure ButtonOfExitClick(Sender: TObject); procedure FormActivate(Sender: TObject); procedure ButtonOfFindClick(Sender: TObject); procedure EditOfFindClick(Sender: TObject); private { Private declarations } public { Public declarations } end; TTree = class private Root:PItem; public constructor Create; procedure Add (var p:PItem; Key:TInfo); procedure Del (var P:PItem; Key:TInfo); function Check (var P:PItem):String; function Find (key:Tinfo):ShortInt; destructor Destroy (P: PItem); end; var Form1: TForm1; Tree: TTree; Key: TInfo; implementation
constructor TTree.Create; begin Root := nil; end;
procedure TTree.Add(var p:PItem;Key: TInfo); // Процедура добавляет элемент // в дерево begin if p=Nil then // Если узел пуст begin New(p); // создаем новый узел p^.Left:=nil; // Левый указатель на Nil p^.Right:=nil; // Правый указателт на Nil p^.key:=key; end else // Если узал не пуст, то if key<p^.key then // Если доб. элемент меньше Add(p^.Left,key) // Добавляем его слева еlse // Если больше Add(p^.Right,key); // Добавляем справа end;
procedure TTree.Del(var P:PItem; Key: TInfo); // Удаление узла var Q: PItem; procedure Delete(var R: PItem); // процедура удаляет узел имеющий двух потомков, заменяя его на самый правый // узел левого поддерева begin if R^.Right <> nil then // обойти дерево справа Delete(R^.Right) else begin // дошли до самого правого узла // заменить этим узлом удаляемый Q^.Key := R^.Key; Q := R; R := R^.Left; end; end;
// Delete begin // Del if P <> nil then // искать удаляемый узел if Key < P^.Key then // Если Уд.Элемент меньше Del(P^.Left, Key) // Искать в левом поддереве else // Если больше if Key > P^.Key then Del(P^.Right, Key) // искать в правом поддереве else begin // узел найден, надо его удалить // сохранить ссылку на удаленный узел Q := P; if Q^.Right = nil then // справа nil // и ссылку на узел надо заменить ссылкой на этого потомка P := Q^.Left else if Q^.Left = nil then // слева nil // и ссылку на узел надо заменить ссылкой на этого потомка P := P^.Right else // узел имеет двух потомков Delete(Q^.Left); Dispose(Q); end; end;
procedure TForm1.Prosmotr(P:PItem;Item: var TmpItem:TTreeNode; begin if P <> nil then begin
TmpItem:=TreeView.Items. Prosmotr(P^.Left,TmpItem); Prosmotr(P^.Right,TmpItem); TreeView.FullExpand; end; end;
function TTree.Check(var P:PItem):String; // Проверяет, есть ли в дереве var //одинаковые элементы i,n:byte;
Elem,Str:String; function Recording(P:PItem):String; // Записивает все элементы дерева в строку begin if P<>nil then
Recording:=Recording(p^.Left)+
end; begin // Check n:=0; Str:=Recording(Root); i:=Pos(' ',Str); while i<>0 do begin Elem:=Copy(Str,1,i); n:=n+Pos((' '+Elem),Str); Delete(Str,1,i); i:=Pos(' ',Str); end; if n<>0 then Check:='В
дереве есть одинаковые else Check:='В
дереве нет одинаковых end;
function TTree.Find(key:Tinfo): var n:shortint;//от
корня до ближайшей вершины с заданным
значением procedure Search(var p:PItem;x:Tinfo); begin if p=nil then n:=-1 else if x=p^.Key then n:=n+1 else if x>p^.Key then begin n:=n+1; Search(p^.right,x); end else begin n:=n+1; Search(p^.Left,x); end; end;//Search begin//Find n:=-1; Search(Root,key); Find:=n; end;
destructor TTree.Destroy(P: PItem); // Удаляет узел и всех его потомков в дереве begin if P <> nil then begin if P^.Left <> nil then Destroy(P^.Left); if P^.Right <> nil then Destroy(P^.Right); Dispose(P); end; end;
{$R *.dfm} procedure TForm1.ButtonOfAddClick( var Item:TTreeNode; begin Item:=nil; Key:=StrToInt(ComboBoxOfAdd. Tree.Add(Tree.Root,Key); TreeView.Items.Clear; Prosmotr(Tree.Root,Item); end;
procedure TForm1.ButtonOfDelClick( var Item:TTreeNode; begin Item:=nil; Key:=StrToInt(EditOfDel.Text); Tree.Del(Tree.Root,Key); EditOfDel.Clear; TreeView.Items.Clear; Prosmotr(Tree.Root,Item); end;
procedure TForm1.ButtonOfCheckClick( begin EditOfCheck.Text:=Tree.Check( end;
procedure TForm1.ButtonOfExitClick( begin Close; Tree.Destroy(Tree.Root); end; procedure TForm1.FormActivate(Sender: TObject); // Инициализация дерева begin Tree:= TTree.Create; end;
procedure TForm1.ButtonOfFindClick( begin key:=StrToInt(EditOfFind.Text) EditOfFind.Text:=FloatToStr( end;
procedure TForm1.EditOfFindClick(Sender: TObject); begin EditOfFind.Clear; end; end. |