
Двоичноедерево
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;
}