На этом шаге мы приведем тексты функций, осуществляющих поиск заданной вершины в дереве.
Нерекурсивный поиск проводится следующим образом:
#define TRUE 1 #define FALSE 0 void Poisk (int k, node **Tree, node **Res) // Поиск вершины с ключом k в дереве (нерекурсивный алгоритм). // *Tree - указатель на вершину дерева. // *Res - указатель на найденную вершину // или на лист, если вершины в дереве нет. // B - глобальная булевская переменная: // TRUE, если вершина с ключом k в дереве найдена, // FALSE, в противном случае. { node *p, *q; B = FALSE; p = q = *Tree; if (*Tree!=NULL) do { q = p; if ((*p).Key==k) B = TRUE; else { q = p; if (k<(*p).Key) p = (*p).Left; else p = (*p).Right; } } while (!B && p!=NULL); *Res = q; }
а рекурсивный - так:
node Poisk_1 (int k, node** Tree) // Поиск вершины с ключом k в дереве (рекурсивный алгоритм). // *Tree - указатель на вершину дерева. // Функция возвращает указатель на вершину, // содержащую ключ k. { if (*Tree==NULL) return (NULL); else if ((**Tree).Key==k) return (*Tree); else { if (k<(**Tree).Key) return Poisk_1 (k,&((**Tree).Left)); else return Poisk_1 (k,&((**Tree).Right)); } }
На следующем шаге мы приведем алгоритм добавления вершины в дерево.