Скачиваний:
89
Добавлен:
10.05.2014
Размер:
37.85 Кб
Скачать

Двоичноедерево

struct Node{

int key;

Node *left, *right;

};

Node *search(Node *root, int k)

{

while(root&& root->key != k)

root = k < root->key ? root->left : root->right;

return root;

}

Node *recsearch(Node *root, int k)

{

if(!root)

returnNULL; /* элемент с указанным ключом отсутствует */

return (root->key == k) ? root : (k < root->key) ? recsearch(root->left, k) : recsearch(root->right, k);

}

Node **find(Node *root, int k)

{

Node **pptr = &root;

while(*pptr&& (*pptr)->key != k)

pptr = k < (*pptr)->key ? &(*pptr)->left : &(*pptr)->right;

returnpptr;

}

struct Node{

int key;

Node *left, *right;

};

Node *insert(Node **proot, int k)

{

Node **ptr = proot;

Node *cur;

/* поиск позиции в дереве для включения нового элемента;

можно использовать рассмотренную выше функцию find() */

while(*ptr){

if((*ptr)->key == k)

returnNULL; /* элемент с таким ключом в таблице есть */

ptr = k < (*ptr)->key ? &(*ptr)->left : &(*ptr)->right;

}

/* создание нового элемента дерева*/

Node *cur = newNode;

if(!cur)

returnNULL; /* нет свободной памяти */

cur->key = k;

cur->left = cur->right = NULL;

/* нашли позицию; включаем новый элемент */

*ptr = cur;

return cur;

}

struct Node{

int key;

Node *left, *right;

};

/* рекурсивная функция включения нового элемента в двоичное дерево.

* Результат – NULL, если элемент с таким ключом в таблице уже есть, или

* указатель на включенный элемент.

* Так как функция включает новый элемент в корень дерева (должно

* измениться значение указателя на корень дерева), в функцию нужно

* передать указатель на указатель на корень дерева – Node **.

*/

Node *instree (Node **proot, Node *newnode)

{

Node **ptr = proot;

if(!*proot){

/* деревопусто */

*proot = newnode;

returnnewnode;

}

/* выборнужногоподдерева */

if((*proot)->key == newnode->key)

returnNULL; /* элемент с таким ключом в таблице – дереве есть */

ptr = (newnode->key < (*proot)->key) ?

&(*proot)->left :&(*proot)->right;

/* рекурсивный вызов функции включения нового элемента в выбранное

* поддерево */

returninstree(ptr, newnode);

}

/* Функция включения нового элемента в таблицу. Результат – NULL, если

* элемент не может быть включен в таблицу, и указатель на новый элемент

* впротивномслучае

*/

Node *insert(Node **proot, int k)

{

Node *cur, *ptr;

/* создание нового элемента таблицы – дерева */

Node *cur = new Node;

if(!cur)

returnNULL; /* нет свободной памяти */

cur->key = k;

cur->left = cur->right = NULL;

/* включение нового элемента в дерево */

if(!(ptr = instree(proot, cur)))

free(cur);

return ptr;

}

ОБХОД

1) КЛП – прямой

int cnt – порядковый номер узла

void str(node *root){

if(!root) return;

count<<(++cnt)<<root->info;

str(root->left);

str(root->right);

}

2) ЛКП – обратный – по возрастанию ключей

int cnt – порядковый номер узла

void str(node *root){

if(!root) return;

str(root->left);

count<<(++cnt)<<root->info;

str(root->right);

}

3) ЛПК – концевой

int cnt – порядковый номер узла

void str(node *root){

if(!root) return;

str(root->left);

str(root->right);

count<<(++cnt)<<root->info;

}