EDA 2004/2005 Árboles árbol = nodos (raíz, hojas) + aristas longitud del camino (único) raíz - nodo: # aristas profundidad de un nodo: longitud del camino raíz – nodo altura de un nodo: longitud del camino nodo – hoja más profunda (altura árbol=altura raíz) a b e c d f tamaño de un nodo: # descendientes que tiene, él inclusive (tamaño árbol=tamaño raíz) g h Paolo Rosso Grupos: 2H+ENG - ETSIA EDA 2004/2005 Árbol binario a cada nodo max 2 hijos (izq, der) nivel i: # max nodos 2i b c altura h: # max nodos 2h+1-1 árbol binario lleno e d f g árbol binario completo Paolo Rosso Grupos: 2H+ENG - ETSIA EDA 2004/2005 Nodo binario d operaciones de recorrido: • recorrido en amplitud (por niveles), iterativo: recorrer nivel a nivel, de izq a der abcdefg • recorrido en profundidad, a recursivo: recorrer “bajando” en el árbol PreOrden: raí z,hijoIzq,hijoDer abdcegf b c PostOrden: hijoIzq,hijoDer,raí z dbgefca e f InOrden: hijoIzq,raí z,hijoDer dbaegcf g Paolo Rosso Grupos: 2H+ENG - ETSIA 1 EDA 2004/2005 Ejercicio 1 enQueNivel (Objectx) ? Paolo Rosso Grupos: 2H+ENG - ETSIA EDA 2004/2005 Ejercicio 1 int enQueNivel(Object x) { // en NodoBinariollamada int res; // desde ArbolBinario i f ( this.dato.equals(x) ) res = 0; else { res = -1; i f ( this.izq != null ) res = this.izq.enQueNivel(x); i f ( res == -1 && this.der != null) res=this.der.enQueNivel(x); // si no está, res == -1; si ésta, se ha explorado un nivel más i f ( res != -1 ) res++; } return res; } Paolo Rosso Grupos: 2H+ENG - ETSIA EDA 2004/2005 Ejercicio 2 imprimirNivel (int k) ? Paolo Rosso Grupos: 2H+ENG - ETSIA 2 EDA 2004/2005 Ejercicio 2 // 0<=k<=altura() String imprimirNivel(int k) { String res; i f ( k == 0 ) res = this.dato.toString()+" "; else { res = ""; i f( this.izq != null ) res += this.izq.imprimirNivel(k-1); i f( this.der != null ) res += this.der.imprimirNivel(k-1); } return res; } Paolo Rosso Grupos: 2H+ENG - ETSIA EDA 2004/2005 Prueba Árbol binario public class PruebaArbolBinario { static public void main( String [ ] args ) throws UnionNoPermitida { ArbolBinario t1 = new ArbolBinario(new Integer (1)); ArbolBinario t3 = new ArbolBinario(new Integer (3)); ArbolBinario t5 = new ArbolBinario(new Integer (5)); ArbolBinario t7 = new ArbolBinario(new Integer (7)); ArbolBinario t2 = new ArbolBinario(); ArbolBinario t4 = new ArbolBinario(); ArbolBinario t6 = new ArbolBinario(); t2.unir(new Integer (2),t1,t3); System.out.println("t2, unión de raiz =2,t1=1 y t3=3,recorrido In-Orden"); // Combrobar en laboratorio si imprimirInOrden() “imprime”. En caso // contrario habrá que hacerlo … t2.imprimirInOrden(); Paolo Rosso Grupos: 2H+ENG - ETSIA EDA 2004/2005 Prueba Árbol binario System.out.println("Tras la unión, t1 recorrido In-Orden"); t1.imprimirInOrden(); System.out.println("Tras la unión, t3 recorrido In-Orden"); t3.imprimirInOrden(); t6.unir(new Integer (6),t5,t7); System.out.println("t6, unión de raiz =6, t5=5 y t7=7, recorrido In-Orden"); t6.imprimirInOrden(); t4.unir(new Integer (4),t2,t6); System.out.println("t4, unión de raiz =4, t2 y t6 , recorrido In-Orden"); t4.imprimirInOrden(); System.out.println("Tamaño de t4: "+t4.tamanyo()); System.out.println("Altura de t4: "+t4.altura()); System.out.println("Dato raiz de t4: "+t4.raiz.dato); Paolo Rosso Grupos: 2H+ENG - ETSIA 3 EDA 2004/2005 Prueba Árbol binario System.out.print("Búsqueda del nivel en el que se encuentra un elemento"); input teclado = new input(); int leido = leerEntero(teclado); Integer objLeido = new Integer(leido) ; int nivelNodo = t4.enQueNivel(objLeido) ; if ( nivelNodo == -1) System.out.println(objLeido+" no es un elemento de este árbol binario"); else System.out.println(objLeido+" está en el nivel "+ nivelNodo); System.out.print("Imprimir los elementos de un nivel dado"); teclado = new input(); leido = leerEntero(teclado) ; if ( leido < 0 && leido > t4.altura()) System.out.println(leido+" no es un nivel de este árbol binario"); else System.out.println("Los nodos de este nivel son: “ Paolo Rosso Grupos: 2H+ENG - ETSIA +t4.imprimirNivel(leido)); EDA 2004/2005 Prueba Árbol binario System.out.println("t4, recorrido Post-Orden"); t4.imprimirPostOrden(); System.out.println("t4, recorrido Pre-Orden"); t4.imprimirPreOrden(); System.out.println("t4, recorrido Por Niveles"); t4.imprimirPorNiveles(); ArbolBinario duplicadoDeT4 = new ArbolBinario(); duplicadoDeT4 .duplicar(t4); System.out.println("DuplicadoDeT4 , recorrido InOrden"); duplicadoDeT4 .imprimirInOrden(); } // main Paolo Rosso Grupos: 2H+ENG - ETSIA EDA 2004/2005 Prueba Árbol binario private static int leerEntero(input teclado) { boolean hayerror = true ; int num = 0; do { try { System.out.print( "\nIntroduzca un valor entero: "); num = Integer.parseInt(teclado.readline()); hayerror=false ; } catch ( NumberFormatException eUnchecked ){ System.out.println("Atento: no has tecleado un entero"); } } while (hayerror); return num; } // leerEntero Paolo Rosso Grupos: 2H+ENG - ETSIA } // PruebaArbolBinario 4