¿Cómo eliminar nodos en un árbol binario?
La eliminación de nodos en un árbol binario se analiza en varias situaciones:
Si el nodo eliminado no tiene un subárbol, elimínelo directamente y modifique el puntero del nodo principal correspondiente para que sea vacío.
Para el caso en el que solo hay un subárbol, considere su subárbol como el subárbol de su nodo padre. Si es izquierdo o derecho se determina según el nodo eliminado.
La situación más complicada es el caso en el que hay dos subnúmeros. Se pueden considerar dos métodos, los cuales tienen la misma idea: usar el nodo más a la derecha del subárbol izquierdo del nodo eliminado A o. el subárbol derecho de A. El nodo más a la izquierda se utiliza como el nodo que reemplaza a A, y el puntero del nodo padre del nodo más a la izquierda o más a la derecha correspondiente se modifica. El método de modificación es similar a 2.
El siguiente es el código de referencia escrito en C:
/************Operación para eliminar nodos del árbol binario******* ********* /
btree?deletenode(btree?root,int?node)
{ btree?parent; btree?point; /p>
int?postion ; parent=binary_search(root,node,&postion);? //Cuando el árbol binario está vacío
if(parent==NULL) return?root; p>
else
{
cambiar(posición)
{?case?-1:point=parent->left;break case? 1?:point=parent->right; case?0?:point=parent;break;
} if(point->left==NULL&&point->right==NULL) { cambiar( posición) { case?-1:parent- >left=NULL;break; case?1:parent->right=NULL;break; case?0:parent=NULL;break }
libre( punto);
return?root;
} if(point->left==NULL&&point->right!=NULL) {
if(postion= =-1)
padre->izquierda=punto->derecha;
si no
if(posición==1)
padre->derecho=punto->derecho;
else root=root->derecho;
libre(punto);
return?root } si; (punto->izquierda!=NULL&&punto-> derecha==NULL) { if(postion==-1)
padre->izquierda=punto->izquierda
if; (posición==1)
padre->derecha=punto->izquierda;
otro
raíz=raíz->retorno?raíz } if(punto->izquierda!=NULL&&? punto->derecha!=NULL) { padre=punto; niño=punto->izquierda mientras(niño->derecha!=NULL) {
padre= niño;
niño =niño->derecha; } punto->datos=niño->datos if(padre->izquierda=niño)
padre->izquierda=niño- >izquierda; else
padre->derecha=niño->izquierda libre(c)
hild); retorno?root;
} }
}