Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Tree part 1

.pdf
Скачиваний:
12
Добавлен:
03.06.2015
Размер:
1.08 Mб
Скачать

Двумерный массив

int T[n][4];

T[ i ][0] is data T[ i ][1] is left T[ i ][2] is right

T[ i ][3] is parent

11

Массив структур

struct TREE { type data;

int

left;

int

right;

int

parent;

int

brother;

};

TREE tree [n];

12

Структура узла с указателями

Структура узла бинарного дерева: struct TREE // NODE !

{ int data; // полезные данные, key TREE *left, *right, *parent;

//ссылки на левого и правого сыновей

};

Структура узла любого (не бинарного) дерева: struct TREE

{ int data; // полезные данные, key TREE **child, *parent;

//ссылки на всех сыновей

};

13

Height Tree

int HeightTree(TREE *p) { int left, right;

if(!p) return -1; left=HeightTree(p->left); right=HeightTree(p->right); if(left>right) return left+1; else return right+1;

} // HeightTree

14

Count & Depth Tree

int CountTree(TREE *p) { int left, right;

if(!p) return 0;

return CountTree(p->left) + CountTree(p->right) + 1; } // CountTree

int DepthTree(TREE *tree) // Current Level { int i; TREE *p=r; if( !p ) return 0;

for(i=0; p->parent; i++) p=p->parent;

return i;

} // DepthTree

15

Обход деревьев - перечисление и обработка

всех узлов в определённом порядке

Вглубину

1.Прямой r a b или r b a

2.Обратный a b r или b a r

r

3. Симметричный a r b или b r a

a b

В ширину r ; a b

16

Прямой обход дерева r a b

int TraversePre(TREE *p, int eval (TREE *p)) // PreOrder

{ if(!p) return 0;

a

 

 

eval(p);

 

 

 

 

 

TraversePre(p->left, eval);

 

 

 

TraversePre(p->right, eval); b

 

c

 

return 1;

 

 

}

d

e

f

 

g h j

a b d c e g f h j

17

Обратный обход дерева a b r

int TraversePost(TREE *p, int eval (TREE *p)) // PostOrder

{if(!p) return 0; TraversePost(p->left, eval );

TraversePost(p->right, eval );

a

eval(p); return 1;

}

b c

d

e

f

g h j

d b g e h j f c a

18

Симметричный обход дерева a r b

int TraverseSym(TREE *p, int eval(TREE *p)) // InOrder

{ if(!p) return 0;

a

 

 

TraverseSym (p->left, eval);

 

 

 

 

 

eval(p);

 

 

 

TraverseSym(p->right, eval); b

 

c

 

return 1;

 

 

}

d

e

f

 

g h j

d b a e g c h f j

19

 

Прямой нерекурсивный

 

 

 

обход дерева

 

 

 

int WalkPre(TREE *tree, int eval(TREE *p) ) / / прямой

 

 

{

if(!tree) return 0; int count; TREE *p=r;

 

 

 

STACK Stack; Stack.top = 0;

 

 

 

Push(Stack, p);

 

 

 

while ( Stack.top >0 )

 

 

 

{ Pop(Stack, p);

 

 

 

eval (p);

 

 

 

if(p->right) Push(Stack, p->right);

 

 

 

if(p->left) Push(Stack, p->left);

 

 

 

count++;

 

 

} // while

 

 

 

return count;

 

 

}

// WalkPre

20

 

 

 

 

 

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]