БОЛЬШАЯ НАУЧНАЯ БИБЛИОТЕКА  
рефераты
Добро пожаловать на сайт Большой Научной Библиотеки! рефераты
рефераты
Меню
Главная
Налоги
Начертательная геометрия
Оккультизм и уфология
Педагогика
Полиграфия
Политология
Право
Предпринимательство
Программирование и комп-ры
Радиоэлектроника
Региональная экономика
Режущий инструмент
Реклама и PR
Ресторанно-гостиничный бизнес бытовое обслуживан
Римское право
Русский язык культура речи
РЦБ ценные бумаги
САПР
Сексология
Семейное право
Социология
Страховое право
Строительство архитектура
Таможенное право
Теория государства и права
Технология
Таможенная система
Транспорт
Физика и энергетика
Философия
Финансы деньги и налоги
Физкультура и спорт
Фотография
Химия
Хозяйственное право
Цифровые устройства
Экологическое право
Экология
Экономика
Экономико-математическое моделирование
Экономическая география
Экономическая теория
Эргономика
Этика и эстетика
Сочинения по литературе и русскому языку
Рефераты по теории государства и права
Рефераты по теории организации
Рефераты по теплотехнике
Рефераты по товароведению
Рефераты по трудовому праву
Рефераты по туризму
Рефераты по уголовному праву и процессу
Рефераты по управлению
Рефераты по менеджменту
Рефераты по металлургии
Рефераты по муниципальному праву
Биографии
Рефераты по психологии
Рефераты по риторике
Рефераты по статистике
Рефераты по страхованию
Рефераты по схемотехнике
Рефераты по науке и технике
Рефераты по кулинарии
Рефераты по культурологии
Рефераты по зарубежной литературе
Рефераты по логике
Рефераты по логистике
Рефераты по маркетингу
Рефераты по международному публичному праву
Рефераты по международному частному праву
Рефераты по международным отношениям
Рефераты по культуре и искусству
Рефераты по кредитованию
Рефераты по естествознанию
Рефераты по истории техники
Рефераты по журналистике
Рефераты по зоологии
Рефераты по инвестициям
Рефераты по информатике
Исторические личности
Рефераты по кибернетике
Рефераты по коммуникации и связи
Рефераты по косметологии
Рефераты по криминалистике
Рефераты по криминологии
Новые или неперечисленные
Без категории

Структуры данных: бинарное упорядоченное несбалансированное дерево

Структуры данных: бинарное упорядоченное несбалансированное дерево

Казанский Государственный Технический Университет

им. А. Н. Туполева

Курсовая работа

по программированию

на тему

Структуры данных:

бинарное упорядоченное несбалансированное дерево

Выполнил: Зверев И. М.

Проверил: Рахматуллин А. И.

Казань

2003

План работы:

1) Постановка задачи

2) Описание программы

3) Код программы на языках Pascal и С++

1. Постановка задачи

Требуется написать программу, реализующую основные операции работы с

деревом. Причём, обязательным условием является использование структуры

данных класс для описания дерева и методов работы с ним.

2. Описание программы

Описание ведётся для кода на Pascalе, отличия для С++ будут указаны

ниже.

В программе основным элементом является класс TTree. Его методы –

это основные процедуры работы с деревом:

Create – конструктор класса – процедура, создающая дерево,

Add – метод добавления элемента в дерево,

Del – метод удаления элемента из дерева,

View – метод вывода элементов дерева на экран,

Exist – метод проверки существования элемента с некоторым ключом, по

сути поиск элемента,

Destroy – деструктор класса – процедура, удаляющая дерево.

Рассмотрим алгоритмы работы процедур.

Create – создание дерева. Присваивает полю Root (корень) значение

nil – указателя, который никуда не указывает.

Add – добавление элемента в дерево. Для построения дерева используем

следующий алгоритм. Первый элемент помещаем в корень (инициализируем

дерево). Далее поступаем следующим образом. Если добавляемый в дерево

элемент имеет ключ больший, чем ключ узла, то, если узел не лист, обходим

его справа. Если добавляемый элемент имеет ключ не больший чем ключ узла,

то, если узел не лист, обходим его слева. Если дошли до листа, то добавляем

элемент соответственно справа или слева.

Del – удаление элемента из дерева.

Удаление узла довольно просто если он является листом или имеет

одного потомка. Например, если требуется удалить узел с ключом М надо

просто заменить правую ссылку узла К на указатель на L. Трудность

заключается в удалении узла с двумя потомками, поскольку мы не можем

указать одним указателем на два направления.

[pic]

[pic]Например, если просто удалить узел с ключом N, то левый

указатель узла с ключом Т должен указывать одновременно на К и R что не

возможно. В этом случае удаляемый узел нужно заменить на другой узел из

дерева. Возникает вопрос, каким же узлом его заменить? Этот узел должен

обладать двумя свойствами: во-первых, он должен иметь не более одного

потомка; во-вторых, для сохранения упорядоченности ключей, он должен иметь

ключ либо не меньший, чем любой ключ левого поддерева удаляемого узла, либо

не больший, чем любой ключ правого поддерева удаляемого узла. Таким

свойствам обладают два узла, самый правый узел левого поддерева удаляемого

узла и самый левый узел его правого поддерева. Любым из этих узлов им можно

заменить удаляемый узел. Например, на рисунке это узлы М и Р.

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

1. Узла с ключем, равным х, нет.

2. Узел с ключем, равным х, имеет не более одного потомка.

3. Узел с ключем, равным х, имеет двух потомков

Вспомогательная рекурсивная процедура del вызывается только в

случае, когда удаляемый узел имеет двух потомков. Она “спускается вдоль”

самой правой ветви левого поддерева удаляемого узла q^ (при вызове

процедуры ей передается в качестве параметра указатель на левое поддерево)

и, затем, заменяет существенную информацию (в нашем случае ключ data) в q^

соответствующим значением самого правого узла r^ этого левого поддерева,

после чего от r^ можно освободиться.

View - печать дерева, обходя его справа налево. Чем дальше элемент

от корня, тем больше ему будет предшествовать пробелов, т. о. путём

несложного алгоритма получается вполне удобно читаемое дерево.

Exist – проверка существования элемента с заданным ключом. Ищем

элемент, двигаясь от корня и переходя на левое или правое поддерево каждого

узла в зависимости от его ключа.

Destroy – удаление дерева. Обходя дерево слева направо, удаляет

элементы. Сначала удаляются потомки узла, затем сам узел.

Различия между описаниями кодов программах на разных языках

относятся в основном к конструкторам и деструкторам. В .pas программах они

определяются директивами и вызываются явно как методы класса из программы,

а в .cpp конструктор вызывается при создании элемента класса и деструктор

автоматически при выходе из программы (для чего объект класса размещается в

памяти динамически).

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

|program PTree; |#include |

| | |

|{$APPTYPE CONSOLE} |#pragma hdrstop |

| | |

|type |typedef int TInfo; |

|TInfo = Byte; |typedef struct Item* PItem; |

|PItem = ^Item; |struct Item Item = record ; |

|end; |class TTree private ; |

|end; | |

|//----------------------------------|//----------------------------------|

|--------------------------- |--------------------------- |

|constructor TTree.Create; |TTree::TTree() |

|begin | |

|//----------------------------------|//----------------------------------|

|--------------------------- |--------------------------- |

|procedure TTree.Add(Key: TInfo); |static void IniTree(PItem& P, TInfo |

| |X) //создание корня дерева |

|procedure IniTree(var P: PItem; X: |P->Key =X; |

|P^.Right := nil; | |

|end; |static void Iendleft (PItem& P, |

| |TInfo X) //добавление узла слева |

|procedure InLeft (var P: PItem; X : | |

|end; | |

| |static void InRight (PItem& P, TInfo|

|procedure InRight (var P: PItem; X :|X) //добавить узел справа |

|TInfo); //добавить узел справа | |

| | |

|procedure Tree_Add (P: PItem; X : |static void Tree_Add (PItem P, TInfo|

|TInfo); |X) |

|var OK: Boolean; | |

| | |

|begin |void TTree::Add(TInfo Key) |

|if Root = nil | |

|then IniTree(Root, Key) |//---------------------------------- |

|procedure TTree.Del(Key: TInfo); |//----------------------------------|

| |---------------------------static |

|procedure Delete (var P: PItem; X: |void delete_ (PItem& P, TInfo X); |

|TInfo); | |

|var Q: PItem; |static void Del(PItem& R, PItem& Q) |

| |//процедура удаляет узел имеющий |

|procedure Del(var R: PItem); |двух потомков, заменяя его на самый |

|//процедура удаляет узел имеющий |правый |

|двух потомков, заменяя его на самый |//узел левого поддерева |

|правый | //Del |

|R := R^.Left; | |

|end; |static void delete_ (PItem& P, TInfo|

|end; //Del |X) |

| | |

|Delete(Root, Key); | |

|end; |void TTree::Del(TInfo Key) |

|//----------------------------------| |

|--------------------------- | |

|procedure PrintTree(R: PItem; L: |//----------------------------------|

|Byte); |--------------------------- |

|var i: Byte; |static void PrintTree(PItem R, TInfo|

|begin |L) |

|if R <> nil then begin | |

|end; | |

|//----------------------------------|void TTree::View() |

|--------------------------- | |

|procedure Search(var P: PItem; X: |//----------------------------------|

|TInfo); |--------------------------- |

|begin |static void Search(PItem& P, TInfo |

|if P = nil then begin |X) |

|WriteLn('Такого элемента нет'); | |

|//----------------------------------| |

|--------------------------- |void TTree::Exist(TInfo Key) |

|destructor TTree.Destroy; | |

| |//Удаление узла и всех его потомков |

|в дереве |//----------------------------------|

|begin |--------------------------- |

|if P <> nil then begin |static void Node_Dispose(PItem P) |

|if P^.Left <> nil then |//Удаление узла и всех его потомков |

|Node_Dispose (P^.Left); |в дереве |

|if P^.Right <> nil then | |

|//----------------------------------| |

|--------------------------- |TTree::~TTree() |

|procedure InputKey(S: String; var | |

|Key: TInfo); | |

|ReadLn(Key); |//----------------------------------|

|end; |--------------------------- |

| |void inputKey(string S, TInfo& Key) |

|var |N: Byte; |

|begin | |

|Tree := TTree.Create; |TTree *Tree = new TTree; |

|repeat |int N; |

|WriteLn('1-Добавить элемент в |TInfo Key; |

|дерево'); |int main(int argc, const char* |

|WriteLn('2-Удалить элемент'); |argv[]) |

|WriteLn('3-Вывести узлы дерева'); | |





17.06.2012
Большое обновление Большой Научной Библиотеки  рефераты
12.06.2012
Конкурс в самом разгаре не пропустите Новости  рефераты
08.06.2012
Мы проводим опрос, а также небольшой конкурс  рефераты
05.06.2012
Сена дизайна и структуры сайта научной библиотеки  рефераты
04.06.2012
Переезд на новый хостинг  рефераты
30.05.2012
Работа над улучшением структуры сайта научной библиотеки  рефераты
27.05.2012
Работа над новым дизайном сайта библиотеки  рефераты

рефераты
©2011