Está en la página 1de 32

El tipo de dato Arbol

Aparecen estructuras de tipo rbol en:


Sist. Op: Sistema de ficheros (Arbol de directorios) Compiladores, proc. textos, algoritmos de bsqueda

Elementos:
Nodos
Conexiones (dirigidas) entre pares de nodos Un nodo particular: Raz

Cada nodo (excepto raz) est conectado al menos

con otro (padre). Relacin padre-hijo.


Arboles M.C. Jos Andrs Vzquez FCC/BUAP 1

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

Hermanos: Nodos con el mismo padre (siblings)


Arboles M.C. Jos Andrs Vzquez FCC/BUAP 2

Arboles. Conceptos (II)


Relacin antepasado (u) / descendiente (v):


Si hay camino de u a v.

Tamao de un nodo:
Nmero de descendientes (incluyendo al nodo)

Arbol (def. recursiva):


o es vaco, o consiste en una raz y cero o ms (sub)rboles no

vacos A1..Ak conectados a la raz


Arboles M.C. Jos Andrs Vzquez FCC/BUAP 3

Arboles. Implementacin
1.- Cada nodo contiene:
Referencias a todos sus hijos
Datos almacenados en el nodo Problema: Nmero de hijos desconocido

2.- Cada nodo:


Lista con sus hijos Referencia a los datos contenidos Referencia a su nodo hermano Representacin "first child / next sibling"
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 4

Arboles. Implementacin (II)


nodoRaiz
sigHermano null primerHijo

null

null

null

null null

null

null

null null

Arboles

M.C. Jos Andrs Vzquez FCC/BUAP

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

... o tiene raz, rbol derecho, rbol izquierdo

Implementacin:
Conocido el nmero de hijos. 2 referencias

Arboles

M.C. Jos Andrs Vzquez FCC/BUAP

Arboles binarios

Arbol binario completo (complete binary tree)


Todas las hojas tiene la misma profundidad El resto de nodos (no terminales) tienen 2 hijos

Arbol binario cuasi-completo (cusi-complete binary tree)


Cada nivel (excepto el ms profundo) debe contener

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

Arboles binarios: Expresiones

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

(recursivamente) Aplicacin del operador a los valores obtenidos


Arboles M.C. Jos Andrs Vzquez FCC/BUAP

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

dato left right

Arboles y recursividad (II)


public NodoBinario duplicar() { NodoBinario root = new NodoBinario(dato); if (left != null) root.left = left.duplicar(); if (right != null) root.right = right.duplicar(); return root; }
size = 1

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); }

size left size right

Arboles

M.C. Jos Andrs Vzquez FCC/BUAP

10

Arboles y recursividad (III)


public static int altura(NodoBinario nodo) // Un rbol con un nico nodo tiene altura = 0 // El nodo tiene que ser != null. Si no, no est definida su altura { int altDerecha = (nodo.right == null ? 0 : 1+altura(nodo.right)); int altIzquierda = (nodo.left == null ? 0 : 1+altura(nodo.left)); return Math.max (altDerecha, altIzquierda); }
altura = 0

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 + ...

altura Izquierda altura Derecha

11

Recorrido de rboles

Recorrido:
Acceso a todos los nodos de un rbol Ej: Para realizar una operacin en cada nodo

Fcil implementacin mediante recursividad Tipos de recorrido:


Segn el orden en que se "visitan" los nodos duplicar(): Recorrido preorder size(), altura(): Recorridos postorder Obtencin de expresiones algebraicas: inorder
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 12

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

M.C. Jos Andrs Vzquez FCC/BUAP

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

M.C. Jos Andrs Vzquez FCC/BUAP

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

M.C. Jos Andrs Vzquez FCC/BUAP

15

Recorrido de rboles. Ejercicio


A B C

Preorden: ... Inorden: ... Postorden: ...


Arboles

M.C. Jos Andrs Vzquez FCC/BUAP

16

Recorrido por niveles

Se recorren los nodos por niveles de profundidad


Dentro de cada nivel, de izquierda a derecha Recorrido en anchura (breadth-first)

Implementacin: Utilizando una Cola


Almaceno en la cola los nodos que deben ser visitados Al visitar un nodo, sus hijos se colocan en la cola La cola puede llegar a contener muchos nodos

Qu sucede usando Pila en lugar de Cola?


recorrido en preorden? Algn cambio?
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 17

Recorrido por niveles (II)


// ...NodoBinario... public static void mostrarPorNiveles(NodoBinario n) { Cola q = new Cola(); q.ponerElemento(n); while(!q.estaVacia()) { NodoBinario elemento = (NodoBinario) q.extraerElemento(); System.out.println(elemento.dato); if (elemento.left != null) q.ponerElemento(elemento.left); if (elemento.right != null) q.ponerElemento(elemento.right); } }
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 18

Arboles binarios de bsqueda


Arboles binarios + Almacenan datos con clave


Clave: Relacin de orden total (...duplicados?)

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

Arboles binarios de bsqueda (II)


6 2 12

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

Arboles binarios de bsqueda (III)

Operaciones de bsqueda:
Como bsqueda dicotmica en vectores ordenados

Eficiencia en las operaciones:


Estructuras lineales coste de operaciones: O(N) La mayor parte de las operaciones son O(log N) Algunas se comportan como O(N) en el peor caso

Permite las operaciones habituales:


Insercin, bsqueda y borrado
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 21

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

Bsqueda en ABB (II)


// Dato almacenado con la clave menor. Recursivo. public Object buscarMin(){return buscarMin(raiz);} private static Object buscarMin(NodoBinario nodo) { if (nodo == null) return null; if (nodo.left == null) return nodo.dato; return buscarMin(nodo.left); }

// 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

Algoritmo recursivo muy simple:


Si el rbol est vaco, colocar como nuevo elemento Si no est vaco: comparar con la clave de la raz Insertar (recursividad) en el subrbol izquierdo o derecho Si ya hay un nodo con ese valor: Error!

Ejercicio:
insertar(Object dato, int clave)

Cuidado con las modificaciones en los nodos!


Arboles M.C. Jos Andrs Vzquez FCC/BUAP 24

Insercin en ABB (II)


public void insertar(Object dato, int clave){ raiz = insertar(dato, clave, raiz);} private static NodoBinarioBusq insertar(Object dato, int clave, NodoBinarioBusq nodo) // Devuelve el estado en que queda el nodo tras insertar { if (nodo == null) nodo = new NodoBinarioBusq(dato, clave); else if (clave < nodo.clave) nodo.left = insertar(dato, clave, (NodoBinarioBusq) nodo.left); else if (clave > nodo.clave) nodo.right = insertar(dato, clave, (NodoBinarioBusq) nodo.right); else System.out.println("Duplicado. Error al insertar!"); return nodo; }

2
1 3
insertar (..., 5)

8
4

2
1 4 5

3 Es necesario devolver un "nodo"? Modificar para tratamiento de claves duplicadas


Arboles M.C. Jos Andrs Vzquez FCC/BUAP

25

Borrado en ABB

La operacin ms compleja.
Puede afectar otros nodos

Posibilidades segn los hijos del nodo a borrar:


Borrado de un nodo sin hijos Se pone a null la referencia de su padre. Nodo con un nico hijo El subrbol hijo se cuelga del padre del nodo a borrar Nodo con 2 hijos Las modificaciones afectan a otros nodos. No trivial
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 26

Borrado en ABB (II)


6 2 8 2 6 8 2 6 8

3
borrar(4) Su nico subrbol hijo ocupa su posicin

borrar(8) ok

borrar(2) Cmo?

Veamos un caso ms sencillo:


Borrado del dato con clave mnima
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 27

Borrado en ABB (III)

Borrado del dato con clave mnima:


Posicin conocida (extremo izquierdo) No tiene ms de 1 hijo

borrarMin()

6 8

1
3

// ... en la clase ArbolBinarioBusq

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

Borrado en ABB (IV)

Caso general de borrado:


Como borrarMin(), salvo nodos con 2 hijos

La posicin del nodo borrado la deber ocupar


El nodo mayor del subrbol izquierdo o el nodo menor del subrbol derecho

Operaciones de buscar y eliminar el nodo de menor (o mayor) clave ya conocidas


Arboles M.C. Jos Andrs Vzquez FCC/BUAP 29

Borrado en ABB (V)


public void borrar(int claveBorrar){ raiz = (NodoBinarioBusq) borrar(claveBorrar, raiz);} private static NodoBinario borrar(int claveBorrar, NodoBinario nodo) { if (nodo == null) System.out.println("Arbol vacio. Error al borrar"); else if (claveBorrar < getClave(nodo)) nodo.left = borrar(claveBorrar, nodo.left); else if (claveBorrar > getClave(nodo)) nodo.right = borrar(claveBorrar, nodo.right); else if ((nodo.left != null) && (nodo.right != null)) { nodo.clave = claveMin(nodo.right); nodo.dato = buscarMin(nodo.right); nodo.right = borrarMin(nodo.right); } else nodo = (nodo.left != null) ? nodo.left : nodo.right; return nodo; } private static int getClave(NodoBinario nodo){ return ((NodoBinarioBusq) nodo).clave;}
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 30

Complejidad y eficiencia

El coste de las operaciones depende de la profundidad del rbol


...de la profundidad del nodo en que se realiza la

operacin

Profundidad del rbol: O(log N)


...si los nodos estn "distribuidos uniformemente"

Problemas:
Algunas operaciones no contribuyen a mantener esa

uniformidad (Ej: Borrado)


Arboles M.C. Jos Andrs Vzquez FCC/BUAP 31

Complejidad y eficiencia (II)

Borrado (nodo con 2 hijos)


Siempre elimina elementos del subrbol derecho Borrados en un subrbol aleatorio Es una solucin?

Casos particularmente malos:


Insercin de datos preordenados... Todos los nodos sin rama izquierda (o derecha)

Mantener equilibrio:
Impedir que se alcancen profundidades innecesarias
Arboles M.C. Jos Andrs Vzquez FCC/BUAP 32

También podría gustarte