Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итоговый конспект Тельнов.docx
Скачиваний:
10
Добавлен:
07.04.2023
Размер:
7.75 Mб
Скачать

15 Двоичные деревья

1. Пустой граф и граф с одним узлом есть двоичное дерево.

2. Граф следующего вида есть двоичное дерево:

3. Двоичное дерево, левая и правая части которого есть двоичное дерево также есть двоичное дерево

Дерево - структура данных, состоящая из узлов и соединяющих их направленных ребер (дуг) причем в каждый узел (кроме корневого) ведет ровно одна дуга

Корень – начальный узел дерева

Лист – узел, из которого не выходит ни одна дуга

Способы обходы дерева:

Head, left, right (hlr): 1 2 4 5 3 6 7

Left, head, right (lhr): 4 2 5 1 6 3 7

Left, right, head (lrh): 4 5 2 6 7 3 1

Код алгоритмов обхода:

Hlr:

Void hlr(Tp p){ //указатель на корень

If(p){

R(p->ptr); //обработка узла

hlr(p->left);

hlr(p->right);

}

}

Lhr

Void lhr(Tp p){ //указатель на корень

If(p){

lhr (p->left);

R(p->ptr); //обработка узла

lhr (p->right);

}

}

Lrh

Void lrh(Tp p){ //указатель на корень

If(p){

lrh (p->left);

lrh (p->right);

R(p->ptr); //обработка узла

}

}

Двоичные деревья полезны когда им присущ внутренний порядок

Пусть определена хэш функция h(<object>)

Рекурсивный поиск в сорт. Дерево с включением

Пусть задан некий <object> для поиска и/или вставки в дерево

Void locate(Tp p){ //з – указатель на корень дерева

If(!p){ p = new T; p->ptr=&<object>; p->left = p->right = NULL;}

else if(<object>!=*p->ptr)

if(h(<object>) < h(*p->ptr)) locate(p->left);

else locate(p->right);

}// в итоге р – указатель на найденный или созданный элемент

Е сли дерево построено при помощи алгоритма locate тогда сортировка есть просто lhr обход или rhl обход сортирующего дерева

Пример:

Пусть данные поступают в порядке: 4 5 2 7 3 6 1

Осуществим lhr обход и получим 1 2 3 4 5 6 7

Итеративный поиск

Пусть задан некий <object>

void search1 (Tp p){ // р – указатель на корень

while(p && (*p->ptr != <object>)

if(h(<object> < h(*p->ptr)) p = p->left;

else p = p->right;

} //в итоге р – указатель на найденный узел или NULL

Рекурсивный поиск в сортирующем дереве

Пусть задан некий <object>

void search2(Tp p){ // р – указатель на корень

if(p) if(<object> != *p -> ptr)

if(h(<object>) < h(*p->ptr) search2(p->left);

else search2(p->right);

} //в итоге р – указатель на найденный узел или NULL

16. Язык СИ: перегруженные функции. Пример.

Перегруженные функции

Можно иметь несколько вариантов одной и той же функции (перегрузка функции).

Сигнатура вариантов функции должна отличаться (количество и типы аргументов), имя функции остается неизменным.

Пример:

overload length; //функция с именем length будет перегружена

// функция length вычисляет длину вектора на плоскости, длину

// вектора в трехмерном пространстве и длину строки в байтах

float length (int x, int y){ return sqrt( x*x + y*y ); } //на плоскости

float length (int x, int y, int z){ return sqrt( x*x + y*y + z*z ); } //в пространстве

int length ( char *s ) { return charWidth * strlen( s ); } //длина строки в байтах

//вызов функции

length ( 1, 5 ); //на плоскости

length ( 1, 0, 3 ); //в пространстве

length ( name ); //длина строки в байтах