/*
 * Elimina un nodo del árbol.
 */
void DeleteString(int p) {
  int  replacement;
  /* Si el nodo a borrar no está en el árbol, no hacemos nada. */
  if ( tree[ p ].parent == UNUSED )
    return;
  /* Si el nodo a borrar sólo tiene un hijo, hacemos una contracción
     del árbol. */
  if ( tree[ p ].larger_child == UNUSED )
    ContractNode( p, tree[ p ].smaller_child );
  else if ( tree[ p ].smaller_child == UNUSED )
    ContractNode( p, tree[ p ].larger_child );
  /* Si el nodo a borrar tiene ambos descendientes. */
  else {
    /* Localizamos el siguiente nodo más pequeño que el nodo que
       intentamos borrar. */
    replacement = FindNextNode( p );
    /* Eliminaos el siguiente nodo más pequeño del árbol. Nótese que
       el nodo "replacemente" nunca va a tener los dos descendientes,
       lo que evita entrar en más de un nivel de recursión. */
    DeleteString( replacement );
    /* Sustituimos el nodo que estamos intentanbo borrar por el que
       acabamos de localizar y eliminar el árbol. */
    ReplaceNode( p, replacement );
  }
}
Exemplo n.º 2
0
//----------------------------------------------------------------------------
// Удаление строки из двоичного дерева поиска 
void DeleteString ( int p)
{
  int replacement;

  if (tree [p].parent == UNUSED)
    return;
  if (tree [p].larger_child == UNUSED)
    ContractNode ( p, tree [p].smaller_child);
  else
    if (tree [p].smaller_child == UNUSED)
      ContractNode ( p, tree [p].larger_child);
    else
    {
      replacement = FindNextNode (p);
      DeleteString (replacement);
      ReplaceNode ( p, replacement);
    }
}