El documento describe el ordenamiento con árbol binario, un algoritmo de ordenamiento que ordena elementos construyendo un árbol binario de búsqueda e insertando cada elemento. Los elementos quedan ordenados al recorrer el árbol en inorden. Tiene complejidad O(n log n) y buen rendimiento al no requerir espacio extra y poder ordenar listas tal cual. Se incluyen pseudocódigos para recorrer el árbol en preorden, inorden y postorden.
2. historia En 1951, a David Huffman y sus compañeros de clase de la asignatura “Teoría de la Información” se les permitió optar entre la realización de un examen final o la presentación de un trabajo. El profesor Robert. M. Fano asignó las condiciones del trabajo bajo la premisa de encontrar el código binario más eficiente. Huffman, ante la imposibilidad de demostrar qué código era más eficiente, se rindió y empezó a estudiar para el examen final. Mientras estaba en este proceso vino a su mente la idea de usar árboles binarios de frecuencia ordenada y rápidamente probó que éste era el método más eficiente.
3. Ordenamiento con árbol binario El ordenamiento con árbol binario es un algoritmo de ordenamiento, el cual ordena sus elementos haciendo uso de un árbol binario de búsqueda. Se basa en ir construyendo poco a poco el árbol binario introduciendo cada uno de los elementos, los cuales quedarán ya ordenados. Después, se obtiene la lista de los elementos ordenados recorriendo el árbol en inorden.
4. Descripción Un árbol binario de búsqueda (ABB) es un árbol binario definido de la siguiente forma: Todo árbol vacío es un árbol binario de búsqueda. Un árbol binario no vacío, de raíz R, es un árbol binario de búsqueda si: En caso de tener subárbol izquierdo, la raíz R debe ser mayor que el valor máximo almacenado en el subárbol izquierdo, y que el subárbol izquierdo sea un árbol binario de búsqueda. En caso de tener subárbol derecho, la raíz R debe ser menor que el valor mínimo almacenado en el subárbol derecho, y que el subárbol derecho sea un árbol binario de búsqueda.
5. Complejidad Insertar elementos en un árbol binario de búsqueda tiene una complejidad O(log n). Entonces, agregar n elementos a un árbol cualquiera da como resultado una complejidad O(n log n). Además, recorrer los elementos del árbol en inorden tiene complejidad O(n).
6. Características Tiene un buen rendimiento. Es estable (no cambia el orden relativo de elementos iguales). No requiere espacio de almacenamiento extra. Puede ordenar listas tal cual las recibe.
7. Pseudocodigo Pseudocodigo preorden preorden( nodo ) //donde nodo es un registro de tipo puntero//valor, nIzq y nDer son campos del registro nodo.//valor = valor del nodo que se esta visitando//nIzq y nDer= valor de tipo apuntador (sirven para no perder los nodos derecho e izquierdo y poder volver cuando se necesite) si nodo <> NULO entonces //(si nodo no es nulo/vacío) visitar el nodo //nodo.info (obtenemos el valor del nodo )preorden(nodo.izq) //llamamos de nuevo el método preorden mandando como parámetro el nodo izquierdo del nodo actual.preorden(nodo.der) //llamamos de nuevo el metodopreorden mandando como parámetro el nodo derecho del nodo actual fin fin
8. Pseudocodigo inorden inorden( nodo ) //donde nodo es un registro de tipo puntero//valor, nIzq y nDer son campos del registro nodo.//valor = valor del nodo que se esta visitando//nIzq y nDer= valor de tipo apuntador (sirven para no perder los nodos derecho e izquierdo y poder volver cuando se necesite) si nodo <> NULO entonces //(si nodo no es nulo/vacío) inorden(nodo.izq) //llamamos de nuevo el método inorden mandando como parámetro el nodo izquierdo del nodo actual.visitar el nodo //nodo.info (obtenemos el valor del nodo )inorden(nodo.der) //llamamos de nuevo el método inorden mandando como parámetro el nodo derecho del nodo actual fin fin
9. Pseudocodigo Pseudocodigo postorden postorden( nodo ) //donde nodo es un registro de tipo puntero//valor, nIzq y nDer son campos del registro nodo.//valor = valor del nodo que se esta visitando//nIzq y nDer= valor de tipo apuntador (sirven para no perder los nodos derecho e izquierdo y poder volver cuando se necesite) si nodo <> NULO entonces //(si nodo no es nulo/vacío) postorden(nodo.izq) //llamamos de nuevo el método postorden mandando como parámetro el nodo izquierdo del nodo actual.postorden(nodo.der) //llamamos de nuevo el método postorden mandando como parámetro el nodo derecho del nodo actualvisitar el nodo //nodo.info (obtenemos el valor del nodo ) fin fin