INGENIERIA DE SISTEMAS 19 ESTRUCTURAS DE DATOS (Listas simples) ARBOLES Un árbol es una estructura no lineal en la que cada nodo puede apuntar a uno o varios nodos. También se suele dar una definición recursiva: un árbol es una estructura compuesta por un dato y varios árboles. Estas definiciones son simples, pero, las características que implican no lo son tanto. Componentes de un árbol A B C D E F G H I J K L M N O Una característica importante de los árboles es que cada nodo sólo puede ser apuntado por otro nodo, es decir, cada nodo sólo tendrá un padre. Nodo hijo: cualquiera de los nodos apuntados por uno de los nodos del árbol. En el ejemplo, L y M son hijos de G. Nodo padre: Nodo del que salen otros nodos. En el ejemplo B es padre de E y F Nodo raíz: nodo que no tiene padre, Nodo hoja: nodo que no tiene hijos. Del ejemplo, K,F,L,M,H,I,N,O son nodos hoja. Cada nodo en un árbol está ubicado en un nivel determinado, empezando por la raíz que se encuentra en el nivel cero (0), sus hijos en el nivel 1, 2, y así sucesivamente, hasta la profundidad o altura que corresponde al máximo nivel del árbol. Orden: es el número máximo de hijos que puede tener cada elemento del árbol. De este modo, diremos que un árbol en el que cada nodo puede apuntar a otros dos es de orden dos, si puede apuntar a tres será de orden tres, etc. Los arboles de orden dos son bastante especiales, de hecho les dedicaremos varios capítulos. Estos árboles se conocen también como árboles binarios ARBOLES BINARIOS Es un árbol especial donde cada nodo padre como máximo tiene dos hijos, denominados como hijo izquierdo y derecho.
INGENIERIA DE SISTEMAS 20 ESTRUCTURAS DE DATOS (Listas simples) ARBOLES BINARIOS DE BÚSQUEDA (ABB) Se trata de arboles en los que se cumple que para cada nodo, el valor del nodo izquierdo de cada raíz es menor que el valor del nodo raíz y que el valor del nodo derecho de la raíz. 6 raiz 4 12 2 5 10 18 3 23 20 Inserción de datos en un Arbol Binario de Búsqueda Cuando se insertan los datos, el primer dato siempre será la raíz. Los siguientes datos buscarán su posición, siguiendo la lógica de que los datos menores son a la izquierda y los datos mayores a la derecha. Por ejemplo: si la secuencia de inserción de datos sería la siguiente: 20, 6, 24, 5, 9, 22, 26, 29, 7, 10, 3, 25 El árbol generado es 20 6 24 5 9 22 26 3 7 10 25 29
INGENIERIA DE SISTEMAS 21 ESTRUCTURAS DE DATOS (Listas simples) Recorridos de un árbol Existen tres tipos de recorridos - Recorrido en pre-orden (RID Raíz, izquierda, derecha) - Recorrido en orden (IRD Izquierda, raíz, derecha) - Recorrido en post-orden (IDR izquierda, derecha, raíz) Por ejemplo los recorridos del anterior árbol de ejemplo anterior serían como sigue: En pre-orden: 20, 6, 5, 3, 9, 7, 10, 24, 22, 26, 25, 29 En orden: 3, 5, 6, 7, 9, 10, 20, 22, 24, 25, 26, 29 En post-orden: 3, 5, 7, 10, 9, 6, 22, 25, 29, 26, 24, 20 IMPLEMENTACIÓN DE ARBOLES BINARIOS DE BUSQUEDA EN JAVA NODO class Nodo info int info; Nodo izda; 5 Nodo dcha; izda dcha public Nodo(int a) info=a; null null izda=dcha=null; ARBOL class Arbol Nodo raiz; raiz void insertar(int a) Nodo aux=new Nodo(a); 5 if(raiz==null) raiz=aux; 5 5 Nodo p,q; null null null null p=q=raiz; while(p!=null) q=p; if(a<p.info) p=p.izda; p=p.dcha; if(a<q.info) q.izda=aux; q.dcha=aux;
INGENIERIA DE SISTEMAS 22 ESTRUCTURAS DE DATOS (Listas simples) EJEMPLO class prueba public static void main(string[] args) Arbol a=new Arbol(); a.insertar(2); a.insertar(1); a.insertar(3); a.inorden(a.raiz); void inorden(nodo r) if(r!=null) inorden(r.izda); System.out.print(r.info+" "); inorden(r.dcha); Función que devuelve la cantidad de Nodos en un árbol int cantidad(nodo r) if(r==null) return 0; return 1+cantidad(r.izda)+cantidad(r.dcha); Función que devuelve la Profundidad (altura) de un árbol La profundidad de un árbol es el nivel más largo que tiene el árbol int profundidad(nodo r) if(r!=null) int i=1,d=1; if(r.izda==null&&r.dcha==null) return 1; if(r.izda!=null) i=i+profundidad(r.izda); if(r.dcha!=null) d=d+profundidad(r.dcha); if(i>d) return i; return d; return 0;
INGENIERIA DE SISTEMAS 23 ESTRUCTURAS DE DATOS (Listas simples) Función que busca un nodo en el árbol boolean buscar(nodo r,int a) if(r==null) return false; if(a<r.info) return buscar(r.izda,a); if(a>r.info) return buscar(r.dcha,a); return true;