Всё сдал! - помощь студентам онлайн Всё сдал! - помощь студентам онлайн

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

Узнайте стоимость индивидуальной работы!

Вы нашли то, что искали?

Вы нашли то, что искали?

Да, спасибо!

0%

Нет, пока не нашел

0%

Узнайте стоимость индивидуальной работы

это быстро и бесплатно

Получите скидку

Оформите заказ сейчас и получите скидку 100 руб.!


Динамические структуры данных: двоичные деревья

Тип Реферат
Предмет Информатика и программирование
Просмотров
1058
Размер файла
19 б
Поделиться

Ознакомительный фрагмент работы:

Динамические структуры данных: двоичные деревья

Дерево — это совокупность элементов, называемых узлами (при этом один из них определен как корень), и отношений (родительский–дочерний), образующих иерархическую структуру узлов. Узлы могут являться величинами любого простого или структурированного типа, за исключением файлового. Узлы, которые не имеют ни одного последующего узла, называются листьями.

В двоичном (бинарном) дереве каждый узел может быть связан не более чем двумя другими узлами. Рекурсивно двоичное дерево определяется так: двоичное дерево бывает либо пустым (не содержит ни одного узла), либо содержит узел, называемый корнем, а также два независимых поддерева — левое поддерево и правое поддерево.

Двоичное дерево поиска может быть либо пустым, либо оно обладает таким свойством, что корневой элемент имеет большее значение узла, чем любой элемент в левом поддереве, и меньшее или равное, чем элементы в правом поддереве. Указанное свойство называется характеристическим свойством двоичного дерева поиска и выполняется для любого узла такого дерева, включая корень. Далее будем рассматривать только двоичные деревья поиска. Такое название двоичные деревья поиска получили по той причине, что скорость поиска в них примерно такая же, что и в отсортированных массивах: O(n) = C • log2n (в худшем случае O(n) = n).

Пример. Для набора данных 9, 44, 0, –7, 10, 6, –12, 45 построить двоичное дерево поиска.

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

Выделим типовые операции над двоичными деревьями поиска:

добавление элемента в дерево;

удаление элемента из дерева;

обход дерева (для печати элементов и т.д.);

поиск в дереве.

Поскольку определение двоичного дерева рекурсивно, то все указанные типовые операции могут быть реализованы в виде рекурсивных подпрограмм (на практике именно такой вариант чаще всего и применяется). Отметим лишь, что использование рекурсии замедляет работу программы и расходует лишнюю память при её выполнении.

Пусть двоичное дерево поиска описывается следующим типом

Type BT=LongInt; U = ^BinTree; BinTree = Record Inf : BT; L, R : U End;

Покажем два варианта добавления элемента в дерево: итеративный и рекурсивный.

{Итеративный вариант добавления элемента в дерево, Turbo Pascal}

Procedure InsIteration(Var T : U; X : BT);

Var vsp, A : U;

Begin

New(A); A^.Inf := X; A^.L:=Nil; A^.R := Nil;

If T=Nil Then T:=A

Else Begin vsp := T;

While vsp <> Nil Do

If A^.Inf < vsp^.Inf

Then

If vsp^.L=Nil Then Begin vsp^.L:=A; vsp:=A^.L End Else vsp:=vsp^.L

Else

If vsp^.R = Nil Then Begin vsp^.R := A; vsp:=A^.R End Else vsp := vsp^.R;

End

End;

{Рекурсивный вариант добавления элемента в дерево, Turbo Pascal}

Procedure InsRec(Var Tree : U; x : BT);

Begin

If Tree = Nil

Then Begin

New(Tree);

Tree^.L := Nil;

Tree^.R := Nil;

Tree^.Inf := x

End

Else If x < Tree^.inf

Then InsRec(Tree^.L, x)

Else InsRec(Tree^.R, x)

End;

Аналогичнона C++.

typedef long BT;

struct BinTree{

BT inf;

BinTree *L; BinTree *R;

};

/* Итеративный вариант добавления элемента в дерево, C++ */

BinTree* InsIteration(BinTree *T, BT x)

{ BinTree *vsp, *A;

A = (BinTree *) malloc(sizeof(BinTree));

A->inf=x; A->L=0; A->R=0;

if (!T) T=A;

else {vsp = T;

while (vsp)

{if (A->inf < vsp->inf)

if (!vsp->L) {vsp->L=A; vsp=A->L;}

else vsp=vsp->L;

else

if (!vsp->R) {vsp->R=A; vsp=A->R;}

else vsp=vsp->R;

}

}

return T;

}

/* Рекурсивный вариант добавления элемента в дерево, C++ */

BinTree* InsRec(BinTree *Tree, BT x)

{

if (!Tree) {Tree = (BinTree *) malloc(sizeof(BinTree));

Tree->inf=x; Tree->L=0; Tree->R=0;

}

else if (x < Tree->inf) Tree->L=InsRec(Tree->L, x);

else Tree->R=InsRec(Tree->R, x);

return Tree;

}

Существует несколько способов обхода (прохождения) всех узлов дерева. Три наиболее часто используемых из них называются обход в прямом (префиксном) порядке, обход в обратном (постфиксном) порядке и обход во внутреннем порядке (или симметричный обход). Каждый из обходов реализуется с использованием рекурсии.

Ниже приведены подпрограммы печати элементов дерева с использованием обхода двоичного дерева поиска в обратном порядке.

{Turbo Pascal}

Procedure PrintTree(T : U);

begin

if T <> Nil

then begin PrintTree(T^.L); write(T^.inf : 6); PrintTree(T^.R) end;

end;

// C++

void PrintTree(BinTree *T)

{

if (T) {PrintTree(T->L); cout << T->inf<< " "; PrintTree(T->R);}

}

Реализуем функцию, возвращающую true (1), если элемент присутствует в дереве, и false (0) — в противном случае.

{Turbo Pascal}

function find(Tree : U; x : BT) : boolean;

begin

if Tree=nil then find := false

else if Tree^.inf=x then Find := True

else if x < Tree^.inf

then Find := Find(Tree^.L, x)

else Find := Find(Tree^.R, x)

end;

/* C++ */

int Find(BinTree *Tree, BT x)

{ if (!Tree) return 0;

else if (Tree->inf==x) return 1;

else if (x < Tree->inf) return Find(Tree->L, x);

else return Find(Tree->R, x);

}

По сравнению с предыдущими задача удаления узла из дерева реализуется несколько сложнее. Можно выделить два случая удаления элемента x (случай отсутствия элемента в дереве является вырожденным):

1) узел, содержащий элемент x, имеет степень не более 1 (степень узла — число поддеревьев, выходящих из этого узла);

2) узел, содержащий элемент x, имеет степень 2.

Случай 1 не представляет сложности. Предыдущий узел соединяется либо с единственным поддеревом удаляемого узла (если степень удаляемого узла равна 1), либо не будет иметь поддерева совсем (если степень узла равна 0).

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

{Turbo Pascal}

function Delete(Tree: U; x: BT) : U;

var P, v : U;

begin

if (Tree=nil)

then writeln('такого элемента в дереве нет!')

else if x < Tree^.inf then Tree^.L := Delete(Tree^.L, x) {случай 1}

else

if x > Tree^.inf

then Tree^.R := Delete(Tree^.R, x) {случай 1}

else

begin {случай 1}

P := Tree;

if Tree^.R=nil

then Tree:=Tree^.L

else if Tree^.L=nil

then Tree:=Tree^.R

else begin

v := Tree^.L;

while v^.R^.R <> nil do v:= v^.R;

Tree^.inf := v^.R^.inf;

P := v^.R;

v^.R :=v^.R^.L;

end;

dispose(P);

end;

Delete := Tree

end;

{C++}

BinTree * Delete(BinTree *Tree, BT x)

{ BinTree* P, *v;

if (!Tree) cout << "такого элемента в дереве нет!" << endl;

else if (x < Tree->inf) Tree->L = Delete(Tree->L, x);

else if (x > Tree-> inf) Tree->R = Delete(Tree->R, x);

else {P = Tree;

if (!Tree->R) Tree = Tree->L; // случай 1

else if (!Tree->L) Tree = Tree->R; // случай 1

else { v = Tree->L;

while (v->R->R) v = v->R; // случай 2

Tree->inf = v->R->inf;

P = v->R; v->R = v->R->L;

}

free(P);

}

return Tree;

}

Примечание. Если элемент повторяется в дереве несколько раз, то удаляется только первое его вхождение.


Нет нужной работы в каталоге?

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

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Гарантируем возврат

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»

1 000 +
Новых работ ежедневно
computer

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

avatar
Математика
История
Экономика
icon
155110
рейтинг
icon
3210
работ сдано
icon
1385
отзывов
avatar
Математика
Физика
История
icon
151477
рейтинг
icon
6002
работ сдано
icon
2716
отзывов
avatar
Химия
Экономика
Биология
icon
105824
рейтинг
icon
2100
работ сдано
icon
1312
отзывов
avatar
Высшая математика
Информатика
Геодезия
icon
62710
рейтинг
icon
1046
работ сдано
icon
598
отзывов
Отзывы студентов о нашей работе
60 154 оценки star star star star star
среднее 4.9 из 5
ТГАСУ
Сделал отличный реферат за пару часов, рекомендую исполнителя однозначно)
star star star star star
АнГТУ
Исполнитель быстро и качественно выполнил работу, доброжелательный и общительный, быстро о...
star star star star star
МАДИ
Работа была выполнена раньше срока с оригинальностью более 80 процентов. Рекомендую
star star star star star

Последние размещённые задания

Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн

Теоретико-методологические основы специальной психологии и...

Другое, Основы специальной психоллгии и коррекционной педагогики

Срок сдачи к 22 апр.

только что

Гост 7.32 тема преобразование энергии в тепловых машинах работающих по третьему закону термодинамики

Реферат, Основы преобразования энергии в электротехнических системах

Срок сдачи к 15 мая

1 минуту назад

Python, Паскаль

Решение задач, Информатика

Срок сдачи к 22 апр.

1 минуту назад

Добавить текста (возможно рисунки) во 2 и 3 главу по 5 страниц.

Диплом, Экономика организации

Срок сдачи к 22 апр.

3 минуты назад

Решить задачу

Решение задач, Математика

Срок сдачи к 23 апр.

3 минуты назад
planes planes
Закажи индивидуальную работу за 1 минуту!

Размещенные на сайт контрольные, курсовые и иные категории работ (далее — Работы) и их содержимое предназначены исключительно для ознакомления, без целей коммерческого использования. Все права в отношении Работ и их содержимого принадлежат их законным правообладателям. Любое их использование возможно лишь с согласия законных правообладателей. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие в связи с использованием Работ и их содержимого.

«Всё сдал!» — безопасный онлайн-сервис с проверенными экспертами

Используя «Свежую базу РГСР», вы принимаете пользовательское соглашение
и политику обработки персональных данных
Сайт работает по московскому времени: 22 апреля 2025 г. 08:34

Вход
Регистрация или
Не нашли, что искали?

Заполните форму и узнайте цену на индивидуальную работу!

Press the down arrow key to interact with the calendar and select a date. Press the question mark key to get the keyboard shortcuts for changing dates.

Файлы (при наличии)

    это быстро и бесплатно