/* * 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 ); } }
//---------------------------------------------------------------------------- // Удаление строки из двоичного дерева поиска 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); } }