Шаг 52.
Поиск вершины в бинарном дереве

    На этом шаге мы приведем тексты функций, осуществляющих поиск заданной вершины в дереве.

    Нерекурсивный поиск проводится следующим образом:

#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));
    }
}

    На следующем шаге мы приведем алгоритм добавления вершины в дерево.




Предыдущий шаг Содержание Следующий шаг