Бинарное упорядоченное дерево

Автор работы: Пользователь скрыл имя, 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 файл

Курсовая.doc

— 233.00 Кб (Скачать файл)

        Необходимо различать три случая:

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/sort/pyramid_sort.php; 
 
 
 
 
 

ПРИЛОЖЕНИЕ  А

Код программы

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:TTreeNode);

    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:TTreeNode); // Просмотр дерева

  var

    TmpItem:TTreeNode;

begin

   if P <> nil then

      begin

         TmpItem:=TreeView.Items.AddChild(Item,IntToStr(P^.Key));

         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)+IntToStr(p^.key)+' '+Recording(p^.Right)

      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):ShortInt; // Функция ноходит в дереве длину пути

  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(Sender: TObject); // Добавить элемент

var

  Item:TTreeNode;

begin

  Item:=nil;

  Key:=StrToInt(ComboBoxOfAdd.Text);

  Tree.Add(Tree.Root,Key);

  TreeView.Items.Clear;

  Prosmotr(Tree.Root,Item);

end;

 

procedure TForm1.ButtonOfDelClick(Sender: TObject); // Удалить элемент

  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(Sender: TObject); // Проверка

begin

EditOfCheck.Text:=Tree.Check(Tree.Root)

end; 

procedure TForm1.ButtonOfExitClick(Sender: TObject); // Выход

begin

Close;

Tree.Destroy(Tree.Root);

end; 
 
 

procedure TForm1.FormActivate(Sender: TObject); // Инициализация дерева

begin

Tree:= TTree.Create;

end; 

 

procedure TForm1.ButtonOfFindClick(Sender: TObject); // Поиск

begin

key:=StrToInt(EditOfFind.Text);

EditOfFind.Text:=FloatToStr(Tree.Find(key));

end; 

procedure TForm1.EditOfFindClick(Sender: TObject);

begin

EditOfFind.Clear;

end; 

end.

 
 
 
 
 
 
 
 

 

          

Информация о работе Бинарное упорядоченное дерево