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