Ver Mensaje Individual
  #3 (permalink)  
Antiguo 19/05/2013, 16:26
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Funcion borrar en ABB

Hace varios años hice algunas implementaciones (de las cuales no estoy orgulloso) de diferentes estructuras de datos. https://github.com/razpeitia/data-structures

Una de las cosas que no me gusto fue que para imprimir bonito un árbol necesitaba usar una o dos queue. Y otra que el borrado de un nodo de un árbol binario no es trivial.

Básicamente para borrar tienes 3 casos:
1. El nodo es una hoja. Lo cual es sencillo por que buscas al padre del nodo y si tiene padre buscas si eres el nodo derecho o izquierdo y eso ahora apunta a null, liberas la memoria de tu nodo y listo.
2. El nodo tiene un solo hijo, en ese caso dejas a ese hijo como y eliminas tu nodo. Obviamente buscas el padre y actualizas las referencias.
3. El nodo tiene 2 hijos. Este es el peor de los casos peor es sencillo, tienes que buscar al mayor elemento que no sea mas grande que el. Si tienes el menor a la izquierda y el mayor a la derecha entonces busca el elemento mas a la derecha del subarbol izquierdo que no tenga un hijo a su lado derecho. Haz el cambio de datos entre ese nodo y el nodo que vas a borrar. Elimina el nodo que sucesor.

Wikipedia ofrece una mejor explicacion con dibujitos.
http://en.wikipedia.org/wiki/Binary_..._tree#Deletion

Aquí te dejo un ejemplo completamente funcional de un árbol binario. Y un queue.
https://gist.github.com/razpeitia/5609319