Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Arboles 1
Arboles 1
Elementos:
Nodos
Conexiones (dirigidas) entre pares de nodos Un nodo particular: Raz
Arboles. Conceptos
Un nico camino conduce de la raz a cada nodo Longitud del camino: Nmero de conexiones a atravesar Nodos sin hijos: Hojas (leaves) Arbol con N nodos N-1 conexiones entre nodos Profundidad de un nodo:
Longitud del camino raz nodo
Altura de un nodo:
Longitud del camino desde el nodo a su hoja ms profunda
Tamao de un nodo:
Nmero de descendientes (incluyendo al nodo)
Arboles. Implementacin
1.- Cada nodo contiene:
Referencias a todos sus hijos
Datos almacenados en el nodo Problema: Nmero de hijos desconocido
null
null
null
null null
null
null
null null
Arboles
Arbol N-ario
Ningn nodo puede tener ms de N hijos El ms utilizado: Binario, 2 hijos (left, right) Def. recursiva (Arbol binario)
... o es vaco
Implementacin:
Conocido el nmero de hijos. 2 referencias
Arboles
Arboles binarios
todos sus posibles nodos En el nivel ms profundo, los nodos estn lo ms a la izquierda que sea posible
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 7
Un nodo terminal representa un operando El resto de los nodos representan operadores (binarios) 6 + ((7 - 3) * 5) + Evaluacin de la expresin:
Evaluacin de los subrboles
3
8
Arboles y recursividad
El tipo rbol se define recursivamente Muchas rutinas para manejo de rboles se implementan fcilmente de forma recursiva
public class NodoBinario { Object dato; NodoBinario left; NodoBinario right; public NodoBinario (Object elemento) { dato = elemento; left = null; right = null; } // Mtodos... }
Arboles M.C. Jos Andrs Vzquez FCC/BUAP
public static int size (NodoBinario nodo) // Tamao del rbol que tiene a ese nodo como raz { if (nodo == null) return 0; else return 1 + size(nodo.left) + size (nodo.right); }
Arboles
10
public static int altura(NodoBinario nodo) // Otra forma de hacer lo mismo... { if (nodo == null) return -1; else return 1 + Math.max(altura(nodo.left), altura(nodo.right)); }
Arboles M.C. Jos Andrs Vzquez FCC/BUAP
1 + ...
1 + ...
11
Recorrido de rboles
Recorrido:
Acceso a todos los nodos de un rbol Ej: Para realizar una operacin en cada nodo
Recorrido "Preorden"
Recorrido preorder:
1.- Nodo raz 2.- Subrbol left en preorden 3.- Subrbol right en preorden
1
Preorden
// en la clase NodoBinario... public void mostrarPreorden() { System.out.println(dato); if (left != null) left.mostrarPreorden(); if (right != null) right.mostrarPreorden(); }
Arboles
3
4 6
13
Recorrido "Inorden"
Recorrido inorder:
1.- Subrbol left en inorden 2.- Nodo raz 3.- Subrbol right en inorden
2
Inorden
// ...NodoBinario... public void mostrarInorden() { if (left != null) left.mostrarInorden(); System.out.println(dato); if (right != null) right.mostrarInorden(); }
Arboles
5
3 7
14
Recorrido "Postorden"
Recorrido postorder:
1.- Subrbol left en postorden 2.- Subrbol right en postorden 3.- Nodo raz
7
Postorden
// ...NodoBinario... public void mostrarPostorden() { if (left != null) left.mostrarPostorden(); if (right != null) right.mostrarPostorden(); System.out.println(dato); }
Arboles
6
3 5
15
16
Caractersticas:
La raz tiene un valor de clave mayor que la de
cualquier elemento del subrbol de la izquierda La raz tiene una clave menor que cualquiera del subrbol de la derecha Ambos subrboles (izquierda y derecha) son igualmente Arboles Binarios de Bsqueda
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 19
13
10
11
Un recorrido inorder muestra los datos ordenados Cul es el coste de una bsqueda? (Ej. 9)
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 20
Operaciones de bsqueda:
Como bsqueda dicotmica en vectores ordenados
Bsqueda en ABB
public class ArbolBinarioBusq { protected NodoBinarioBusq raiz; public Object buscar(int claveBuscar){ return buscar(claveBuscar, raiz);} private static Object buscar(int claveBuscar, NodoBinario n) // Devuelve: dato contenido en el nodo con esa clave, o null { NodoBinarioBusq nodo = (NodoBinarioBusq) n; if (nodo == null) return null; if (nodo.clave > claveBuscar) NodoBinarioBusq return buscar(claveBuscar, nodo.left); clave if (nodo.clave < claveBuscar) dato return buscar(claveBuscar, nodo.right); // Solo queda el caso (nodo.clave == claveBuscar) left right return nodo.dato; }... }
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 22
// Dato almacenado con la clave mayor. Iterativo. public Object buscarMax() { NodoBinario nodo = raiz; if (nodo != null) { while (nodo.right != null) 1 nodo = nodo.right; return nodo.dato; } else return null; }
Arboles M.C. Jos Andrs Vzquez FCC/BUAP
raiz
5
23
Insercin en ABB
Ejercicio:
insertar(Object dato, int clave)
2
1 3
insertar (..., 5)
8
4
2
1 4 5
25
Borrado en ABB
La operacin ms compleja.
Puede afectar otros nodos
3
borrar(4) Su nico subrbol hijo ocupa su posicin
borrar(8) ok
borrar(2) Cmo?
borrarMin()
6 8
1
3
public void borrarMin(){ raiz = (NodoBinarioBusq) borrarMin(raiz); } private static NodoBinario borrarMin(NodoBinario nodo) { if (nodo == null) System.out.println("Arbol vacio. Error al borrar"); else if (nodo.left != null) nodo.left = borrarMin(nodo.left); else nodo = nodo.right; return nodo; } Arboles M.C. Jos Andrs Vzquez FCC/BUAP
borrarMin()
6
8 4
3 1 2
28
Complejidad y eficiencia
operacin
Problemas:
Algunas operaciones no contribuyen a mantener esa
Mantener equilibrio:
Impedir que se alcancen profundidades innecesarias
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 32