Red de conocimientos turísticos - Información de alquiler - ¿Cómo eliminar nodos en un árbol binario?

¿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;

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;

} }

}