Деревья. Двоичные (бинарные) деревья

Содержание

Слайд 2

Способы изображения древовидных структур Граф Вложенные скобки (A(B(E,F(I,J)),C(G),D(H)))

Способы изображения древовидных структур

Граф

Вложенные скобки (A(B(E,F(I,J)),C(G),D(H)))

Слайд 3

Вложенные множества Ломаная последовательность A B E F I J C G D H

Вложенные множества

Ломаная последовательность
A
B
E
F
I
J
C
G
D
H

Слайд 4

Двоичные (бинарные) деревья {R} - корневой узел {L1, L2, ..., Lm}

Двоичные (бинарные) деревья

{R} - корневой узел
{L1, L2, ..., Lm} - левое

поддерево R
{R1, R2, ..., Rm} - правое поддерево R

n
1 … 2n

Слайд 5

N глубина = int (log2N). N=10 000 int(log210 000) = int(13.28) = 13

N глубина = int (log2N).
N=10 000 int(log210 000) = int(13.28) = 13

Слайд 6

Структура двоичного дерева С использованием массива TREE[n]; TREE[K] - TREE[2K+1], TREE[2K+2]

Структура двоичного дерева

С использованием массива TREE[n]; TREE[K] - TREE[2K+1], TREE[2K+2]
В виде динамической структуры
struct

TREE{
int dann;
TREE *pleft;
TREE *pright;
};
Слайд 7

Идеально сбалансированное дерево Взять один узел в качестве корня. Левое поддерево:

Идеально сбалансированное дерево

Взять один узел в качестве корня.
Левое поддерево: nl=n/2.
Правое поддерево:

nr=n-nl-1.
Пример: 6, 4, 2, 3, 8, 9, 0, 1, 7
Слайд 8

TREE* maketree(int n) {TREE *ptr; int nl, nr, x; if (n==0)

TREE* maketree(int n)
{TREE *ptr;
int nl, nr, x;
if (n==0) return NULL;
nl=n/2;
nr=n-nl-1;
ptr=new (TREE);
cout

<< "Input ";
cin >> ptr->dann;
ptr->pleft=maketree(nl);
ptr->pright=maketree(nr);
return ptr;
}
TREE *root;
root=maketree(n);

void print(TREE *ptr, int h)
{
if (ptr) {
print(ptr->pright,h+1);
for (int i=1;i<=h;i++) cout << " ";
cout << ptr->dann << endl;
print(ptr->pleft,h+1);
}
}

Слайд 9

Двоичные деревья выражений 6*(4-2) (3+5)*(8-4)+2 (7/3+(5+6)*2)/4

Двоичные деревья выражений

6*(4-2)

(3+5)*(8-4)+2

(7/3+(5+6)*2)/4

Слайд 10

Деревья двоичного поиска O(N) O(log2N)

Деревья двоичного поиска

O(N) O(log2N)

Слайд 11

Пример: 32, 1, 98, -4, 34, -87, 25, 6, 10, 9,

Пример: 32, 1, 98, -4, 34, -87, 25, 6, 10, 9,

19

32

98

-4

34

-87

25

6

10

9

19

1

30

30

Слайд 12

void build(TREE *tt, char ch) { if (ch dann) if (tt->pleft==NULL)

void build(TREE *tt, char ch)
{
if (chdann)
if (tt->pleft==NULL)
{left=new TREE;
tt->pleft=left;

left->dann=ch;
left->pleft=NULL;
left->pright=NULL;
}
else build(tt->pleft,ch);
else
if (tt->pright==NULL)
{right=new TREE;
tt->pright=right;
right->dann=ch;
right->pleft=NULL;
right->pright=NULL;
}
else build(tt->pright,ch);
}

root=new TREE;
root->dann=str[0];
root->pright=NULL;
root->pleft=NULL;
for (int i=1; i build(root,*(str+i));

Слайд 13

Операции с двоичными деревьями Алгоритмы поиска TREE * poisk(TREE *ptr, char

Операции с двоичными деревьями

Алгоритмы поиска
TREE * poisk(TREE *ptr, char ch)
{
while(ptr->dann!=ch

&& ptr)
if (chdann) ptr=ptr->pleft;
else ptr=ptr->pright;
return ptr;
}

10

Слайд 14

TREE *parent=NULL; TREE *find(char x, TREE* ptr) { while (ptr!=NULL) {

TREE *parent=NULL; TREE *find(char x, TREE* ptr) { while (ptr!=NULL) { if (x==ptr->dann) break; else

{parent=ptr; if (xdann) ptr=ptr->pleft; else ptr=ptr->pright; } } return ptr; }

TREE * poisk(TREE *ptr, char ch,)
{
if (chdann) ptr=poisk(ptr->pleft, ch);
if (ch>ptr->dann) ptr=poisk(ptr->pright, ch);
else return ptr;
}

Слайд 15

Алгоритмы обхода дерева Прямой void preorder(TREE *ptr) { if (ptr) {

Алгоритмы обхода дерева

Прямой
void preorder(TREE *ptr)
{
if (ptr) {
putchar(ptr->dann);
if (ptr->pleft) preorder(ptr->pleft);
if (ptr->pright) preorder(ptr->pright);
}
}

10

5

-7

0

6

8

18

29

Слайд 16

Симметричный void inorder(TREE *ptr) { if (ptr) { if (ptr->pleft) inorder(ptr->pleft);

Симметричный
void inorder(TREE *ptr)
{
if (ptr) {
if (ptr->pleft) inorder(ptr->pleft);
putchar(ptr->dann);
if (ptr->pright) inorder(ptr->pright);
}
}

-7

0

5

6

8

10

18

29

Слайд 17

Обратный void postorder(TREE *ptr) { if (ptr) { if (ptr->pleft) postorder(ptr->pleft);

Обратный
void postorder(TREE *ptr)
{
if (ptr) {
if (ptr->pleft) postorder(ptr->pleft);
if (ptr->pright) postorder(ptr->pright);
putchar(ptr->dann);
}
}

0

-7

8

6

5

29

18

10

Слайд 18

Вертикальная печать дерева A B C D E F G H

Вертикальная печать дерева

A

B

C

D

E

F

G

H

Слайд 19

Удаление дерева TREE* del(TREE *t) { if (t!=NULL) { del(t->pleft); del(t->pright);

Удаление дерева

TREE* del(TREE *t)
{
if (t!=NULL)
{
del(t->pleft);
del(t->pright);
delete t;
}
return NULL;
}
root=del(root);

3

2

7

0

5

9

4

6

11

Слайд 20

Удаление элемента из дерева Элемента со значением, равным х, в дереве

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

Элемента со значением, равным х, в дереве не

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

3

2

7

0

5

9

4

6

11

3

2

7

0

5

9

4

6

11

Слайд 21

Элемент со значением х имеет двух потомков. 3 2 7 0

Элемент со значением х имеет двух потомков.

3

2

7

0

5

9

4

6

11

D
P
R
PR

Слайд 22

R->right=D->right; P->left=R; A Б Г В Д D =PR R P

R->right=D->right;
P->left=R;

A

Б

Г

В

Д

D

=PR

R

P

Слайд 23

PR->right=R->left; A Б Г В Д D PR R P E Ж З К И Л

PR->right=R->left;

A

Б

Г

В

Д

D

PR

R

P

E

Ж

З

К

И

Л

Слайд 24

Двоичные деревья, представляемые массивами A[i] Индекс левого наследника = 2*i+1. Индекс

Двоичные деревья, представляемые массивами

A[i]
Индекс левого наследника = 2*i+1.
Индекс правого наследника

= 2*i+2.
Индекс родителя = (i-1)/2.
Пример:

int A[]={5, 1, 3, 9, 6, 2, 4, 7, 0, 8};

Слайд 25

int A[]={5, 1, 3, 9, 6, 4, #, 7, #, #, #, 2};

int A[]={5, 1, 3, 9, 6, 4, #, 7, #, #,

#, 2};
Слайд 26

Турнирная сортировка A[8]={85, 20, 15, -45, 10, 41, 10, 36} 2k≥N k=3

Турнирная сортировка

A[8]={85, 20, 15, -45, 10, 41, 10, 36}
2k≥N
k=3

Слайд 27

Слайд 28

Слайд 29

O(n log2n)

O(n log2n)

Слайд 30

Пирамиды (heap-tree) Максимальные Минимальные

Пирамиды (heap-tree)

Максимальные Минимальные

Слайд 31

Преобразование массива в пирамиду n n-1 (n-2)/2 Пример: Построим максимальную пирамиду

Преобразование массива в пирамиду

n n-1 (n-2)/2

Пример: Построим максимальную пирамиду
int H[10]={7, 12, 72, 43,

9, 47, 18, 30, 72, 86}

5, 6, …, 9
4, 3, …, 0

Слайд 32

H[4]=9 H[9]=86 H[3]=43 H[8]=72 H[7]=30 H[2]=72 H[5]=47 H[6]=18 H[1]=12 H[3]=72 H[4]=86

H[4]=9
H[9]=86
H[3]=43
H[8]=72 H[7]=30
H[2]=72
H[5]=47 H[6]=18
H[1]=12
H[3]=72 H[4]=86
H[0]=7
H[1]=86 H[2]=72

7

12

72

43

9

47

18

30

86

72

Слайд 33

Добавление элемента в пирамиду 86 72 72 43 12 47 18 30 9 7 80

Добавление элемента в пирамиду

86

72

72

43

12

47

18

30

9

7

80

Слайд 34

Удаление из пирамиды 86 80 72 43 72 47 18 30 9 7 12

Удаление из пирамиды

86

80

72

43

72

47

18

30

9

7

12

Слайд 35

Пирамидальная сортировка Пример: int A[]={54, 21, 90, 38, 23, 0}; 54

Пирамидальная сортировка

Пример: int A[]={54, 21, 90, 38, 23, 0};

54

21

90

38

23

0

0

21

23

38

n log2n