Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички.C++ / Конспект Лекций - Части 1,2.pdf
Скачиваний:
157
Добавлен:
24.02.2016
Размер:
1.97 Mб
Скачать

Print ( p -> Right , level+1); // Вывод левого поддерева

for ( int i=0; i<level; i++) printf("

");

printf("%d \n", p->info);

 

Print( p -> Left , level+1);

// Вывод правого поддерева

}

 

}

//===================== Освобождение памяти ==================

void Del_All(Tree *t) { if ( t != NULL) { Del_All ( t -> Left); Del_All ( t -> Right);

delete t;

}

}

Пояснение к программе

Вводим ключи: 10, 25, 20, 6, 21, 8, 1, 30.

1. Формирование первого элемента (корня) со значением 10 приведет к следующему виду (0 – NULL):

t Root

 

10

 

Left

0 0

Right

Далее, при определении, в какое место (в левое или правое поддерево) добавлять очередной элемент, воспользуемся тем, что бинарное дерево строится упорядоченным по ключевому полю:

узел левого сына (потомка) должен быть меньше узла родителя (предка);

узел правого сына – больше узла родителя.

Рассмотрим несколько шагов цикла while.

Шаг 1:

b = 25;

1.Установили текущий указатель на корень: Tree *t = Root;

2.Флаг для контроля поиска int found=0; чтобы исключить повторение клю-

чей.

3.Внутренний цикл while, выполнять пока текущий указатель t != NULL и искомый ключ не найден (!found);

4.Установили указатель на предка на текущий элемент: Prev = t;

5.Проверяем значение текущего ключа:

1)если b = t -> info, то found = 1; else – игнорируется, вставку не производим, т.к. такой уже есть;

2)если found=1, уходим на новый виток цикла;

3)иначе (25 не равно 10),

153

если b< t->info, то создаем левую ветвь (t = t->Left), иначе – создаем правую ветвь (t = t->Right).

6. Создаем новый элемент:

1)захватываем память: Tree *t1 = new Tree;

2)формируем информационную часть: t1 -> info = b; (25)

3)указатели на потомков в NULL:

t1 -> Left = t1->Right = NULL;

На этом этапе получили следующее:

t Root

 

 

 

 

 

 

 

 

 

 

Prev

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

 

 

 

 

 

Left

 

 

 

 

 

 

 

 

Right

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

t1

 

25 > 10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2) 25 3)0 0 3)

Шаг 2:

i = 2, b = 20;

1.Tree *t = Root;

2.found = 0;

3.Внутренний цикл while, выполнять пока t!=0 и !found;

Prev = t;

4. Проверяем значение текущего ключа:

1) (шаг 1.1): если b[i] ?= t -> info (10?=20), – Нет!

иначе: если b[i] ?< t->info (20?<10) – Нет! значит: t = t->Right – создаем правую ветвь;

2) (шаг 1.2): если b[i] ?= t -> info (20?=25), – Нет!

иначе: если b[i] ?< t->info (20?<25) – Да! значит: t = t->Left = NULL; – указатель на правую ветвь;

3)конец цикла while.

5.Создается по уже рассмотренному алгоритму новый элемент и присоединяется слева от последнего:

t1 = new Tree;

t1 -> info = b; (20)

t1 -> Left = t1 -> Right = NULL; Prev -> Left = t1;

Графически это выглядит следующим образом:

154

Соседние файлы в папке методички.C++