Temario
Tema 5. Estructuras de Datos no Lineales
5.1 rboles Binarios
Especificacin Utilizacin Representacin Enlazada
5.2 rboles n-arios 5.3 rboles Binarios de Bsqueda 5.4 rboles Parcialmente Ordenados
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
5.1 rboles Binarios
rbol:
raz Coleccin de Elementos. Existe una estructura jerrquica: relacin de paternidad. 2 elementos: Nodos Nodo Raz. 4 5 6 3 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
5.1 rboles Binarios
rbol Binario:
raz
O bien es el conjunto vaco rbol vaco. O bien no es vaco:
elemento Raz. A1, A2 Izquierdo y Derecho. 4 2
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
5.1 rboles Binarios
Formas de construir rboles Binarios: Aadir nodos a un rbol Binario:
como Hijo Izquierdo. como Hijo Derecho.
Utilizar directamente en la definicin recursiva de rbol Binario.
Entradas: A1,A2 Nodo Raz Salida: El nuevo rbol Binario
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
5.1 rboles Binarios
Operaciones de Construccin:
ArbolBinario(Elemento e);
Operaciones de Acceso:
Elemento recupera(Posicion p) const; void asigna(Posicion p, Elemento e);
Operaciones de Modificacin:
void void void void insertaIzquierdo(Posicion p, Elemento e); insertaDerecho(Posicion p, Elemento e); suprimeIzquierdo(Posicion p); suprimeDerecho(Posicion p);
Operaciones de Posicionamiento:
Posicion Posicion Posicion Posicion Posicion inicio() const; fin() const; izquierdo(Posicion p) const; derecho(Posicion p) const; padre(Posicion p) const;
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
5.1 rboles Binarios
TDA rbol Binario: Especificacin Informal (Construccin y Acceso)
ArbolBinario(Elemento e) efecto: devuelve un rbol binario con el elemento e en la posicin raz. Elemento recupera(Posicion p) const requerimientos: p no es fin. efecto: devuelve el elemento que ocupa la posicin p. void asigna(Posicion p, Elemento e) requerimientos: p no es fin. efecto: asigna el elemento e a la posicin p.
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
5.1 rboles Binarios
TDA rbol Binario: Especificacin Informal (Modificacin)
void insertaIzquierdo(Posicion p, Elemento e) requerimientos: p no es fin y el hijo izquierdo de p es fin. efecto: inserta e como hijo izquierdo de p. void insertaDerecho(Posicion p, Elemento e) requerimientos: p no es fin y el hijo derecho de p es fin. efecto: inserta e como hijo derecho de p. void suprimeIzquierdo(Posicion p) requerimientos: p no es fin y el hijo izquierdo de p no es fin. efecto: suprime el hijo izquierdo de p y todos sus descendientes. void suprimeDerecho(Posicion p) requerimientos: p no es fin y el hijo derecho de p no es fin. efecto: suprime el hijo derecho de p y todos sus descendientes.
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
5.1 rboles Binarios
TDA rbol Binario: Especificacin Informal (Posicionamiento)
Posicion inicio() const efecto: devuelve la posicin raz. Posicion fin() const efecto: devuelve la posicin fin. Posicion izquierdo(Posicion p) const requerimientos: p no es fin. efecto: devuelve el hijo izquierdo de p o la posicin fin si p no tiene hijo izquierdo. Posicion derecho(Posicion p) const requerimientos: p no es fin. efecto: devuelve el hijo derecho de p o la posicin fin si p no tiene hijo derecho. Posicion padre(Posicion p) const requerimientos: p no es fin. efecto: devuelve el padre de p o la posicin fin si p es la posicin raz.
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales 8
5.1 rboles Binarios
Clase ArbolBinario: Operaciones de Clase Mnima
class ArbolBinario { private: ... public: ArbolBinario(Elemento e); ~ArbolBinario(); ArbolBinario(const ArbolBinario & a); ArbolBinario & operator=(const ArbolBinario & a); ... };
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
5.1 rboles Binarios
Clase ArbolBinario: Operaciones de Posicionamiento
class ArbolBinario { private: ... public: ... Posicion inicio() const; Posicion fin() const; Posicion izquierdo(Posicion p) const; Posicion derecho(Posicion p) const; ... };
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
10
5.1 rboles Binarios
Clase ArbolBinario: Operaciones de Acceso y Modificacin
class ArbolBinario { private: ... public: ... Elemento recupera(Posicion p) const; void asigna(Posicion p, Elemento e); void void void void }; insertaIzquierdo(Posicion p, Elemento e); insertaDerecho(Posicion p, Elemento e); suprimeIzquierdo(Posicion p); suprimeDerecho(Posicion p);
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
11
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1);
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
12
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio();
raz p1 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
13
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2);
raz p1 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
14
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3);
raz p1 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
15
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1);
raz p1 1
p2
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
16
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4);
raz p1 1
p2
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
17
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5);
raz p1 1
p2
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
18
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5); Posicion p3 = a.izquierdo(p2);
raz p1 1
p2
p3
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
19
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5); Posicion p3 = a.izquierdo(p2); a.insertaDerecho(p3,7);
raz p1 1
p2
p3
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
20
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5); Posicion p3 = a.izquierdo(p2); a.insertaDerecho(p3,7); Posicion p4 = a.derecho(p1);
raz p1 1
p2
p4
p3
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
21
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5); Posicion p3 = a.izquierdo(p2); a.insertaDerecho(p3,7); Posicion p4 = a.derecho(p1); a.insertaDerecho(p4,6);
raz p1 1
p2
p4
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
22
5.1 rboles Binarios
Esquemas de Recorrido en rboles Binarios:
Preorden(A):
Si A es vaco lista vaca. Si A no es vaco Raz + Preorden(A1) + Preorden(A2).
Inorden(A):
Si A es vaco lista vaca. Si A no es vaco Inorden(A1) + Raz + Inorden(A2).
Postorden(A):
Si A es vaco lista vaca. Si A no es vaco Postorden(A1) + Postorden(A2) + Raz.
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
23
5.1 rboles Binarios
Recorridos en un rbol Binario: Preorden, Posorden, Inorden
void preorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { cout << a.recupera(p) << " "; preorden(a,a.izquierdo(p)); preorden(a,a.derecho(p)); } } void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } } void inorden(const ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
24
5.1 rboles Binarios
Paso de parmetros en mtodos que utilizan rboles:
Por valor
Ineficiente Incorrecta: se copia el rbol, pero se pasa la posicin del rbol original
Por referencia
Eficiente Correcta Necesaria cuando se desea modificar el rbol
Por referencia constante
Eficiente Correcta Slo se puede utilizar cuando no se va a modificar el rbol
Por simplicidad, en los mtodos que utilizan rboles realizaremos siempre el paso por referencia, aunque en aquellos mtodos que no modifican los rboles sera ms adecuado utilizar un paso por referencia constante.
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales 25
5.1 rboles Binarios
Recorridos en un rbol Binario: Preorden 1
void preorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { cout << a.recupera(p) << " "; preorden(a,a.izquierdo(p)); preorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
26
5.1 rboles Binarios
Recorridos en un rbol Binario: Preorden 1, 2
void preorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { cout << a.recupera(p) << " "; preorden(a,a.izquierdo(p)); preorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
27
5.1 rboles Binarios
Recorridos en un rbol Binario: Preorden 1, 2, 4
void preorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { cout << a.recupera(p) << " "; preorden(a,a.izquierdo(p)); preorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
28
5.1 rboles Binarios
Recorridos en un rbol Binario: Preorden 1, 2, 4, 7
void preorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { cout << a.recupera(p) << " "; preorden(a,a.izquierdo(p)); preorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
29
5.1 rboles Binarios
Recorridos en un rbol Binario: Preorden 1, 2, 4, 7, 5
void preorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { cout << a.recupera(p) << " "; preorden(a,a.izquierdo(p)); preorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
30
5.1 rboles Binarios
Recorridos en un rbol Binario: Preorden 1, 2, 4, 7, 5, 3
void preorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { cout << a.recupera(p) << " "; preorden(a,a.izquierdo(p)); preorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
31
5.1 rboles Binarios
Recorridos en un rbol Binario: Preorden 1, 2, 4, 7, 5, 3, 6
void preorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { cout << a.recupera(p) << " "; preorden(a,a.izquierdo(p)); preorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
32
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
33
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
34
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
35
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
36
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7, 4
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
37
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7, 4
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
38
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7, 4, 5
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
39
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7, 4, 5, 2
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
40
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7, 4, 5, 2
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
41
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7, 4, 5, 2
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
42
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7, 4, 5, 2, 6
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
43
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7, 4, 5, 2, 6, 3
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
44
5.1 rboles Binarios
Recorridos en un rbol Binario: Posorden 7, 4, 5, 2, 6, 3, 1
void posorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { posorden(a,a.izquierdo(p)); posorden(a,a.derecho(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
45
5.1 rboles Binarios
Recorridos en un rbol Binario: Inorden
void inorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
46
5.1 rboles Binarios
Recorridos en un rbol Binario: Inorden
void inorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
47
5.1 rboles Binarios
Recorridos en un rbol Binario: Inorden 4
void inorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
48
5.1 rboles Binarios
Recorridos en un rbol Binario: Inorden 4, 7
void inorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
49
5.1 rboles Binarios
Recorridos en un rbol Binario: Inorden 4, 7, 2
void inorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
50
5.1 rboles Binarios
Recorridos en un rbol Binario: Inorden 4, 7, 2, 5
void inorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
51
5.1 rboles Binarios
Recorridos en un rbol Binario: Inorden 4, 7, 2, 5, 1
void inorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
52
5.1 rboles Binarios
Recorridos en un rbol Binario: Inorden 4, 7, 2, 5, 1, 3
void inorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
53
5.1 rboles Binarios
Recorridos en un rbol Binario: Inorden 4, 7, 2, 5, 1, 3, 6
void inorden(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { inorden(a,a.izquierdo(p)); cout << a.recupera(p) << " "; inorden(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
54
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk Camino 1 a 2 1,2 Longitud 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
55
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk Camino 1 a 2 1,2 1 a 3 1,3 Longitud 1 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
56
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 2 1 a 3 1 a 4 Camino 1,2 1,3 1,2,4 Longitud 1 1 2
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
57
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 2 1 a 3 1 a 4 1 a 5 Camino 1,2 1,3 1,2,4 1,2,5 Longitud 1 1 2 2
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
58
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 2 1 a 3 1 a 4 1 a 5 1 a 6 Camino 1,2 1,3 1,2,4 1,2,5 1,3,6 Longitud 1 1 2 2 2
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
59
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 2 1 a 3 1 a 4 1 a 5 1 a 6 1 a 7 Camino 1,2 1,3 1,2,4 1,2,5 1,3,6 1,2,4,7 Longitud 1 1 2 2 2 3
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
60
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 2 1 a 3 1 a 4 1 a 5 1 a 6 1 a 7 2 a 4 Camino 1,2 1,3 1,2,4 1,2,5 1,3,6 1,2,4,7 2,4 Longitud 1 1 2 2 2 3 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
61
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 2 1 a 3 1 a 4 1 a 5 1 a 6 1 a 7 2 a 4 2 a 5 Camino 1,2 1,3 1,2,4 1,2,5 1,3,6 1,2,4,7 2,4 2,5 Longitud 1 1 2 2 2 3 1 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
62
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 2 1 a 3 1 a 4 1 a 5 1 a 6 1 a 7 2 a 4 2 a 5 2 a 7 Camino 1,2 1,3 1,2,4 1,2,5 1,3,6 1,2,4,7 2,4 2,5 2,4,7 Longitud 1 1 2 2 2 3 1 1 2
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
63
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 2 1 a 3 1 a 4 1 a 5 1 a 6 1 a 7 2 a 4 2 a 5 2 a 7 3 a 6 Camino 1,2 1,3 1,2,4 1,2,5 1,3,6 1,2,4,7 2,4 2,5 2,4,7 3,6 Longitud 1 1 2 2 2 3 1 1 2 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
64
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 2 1 a 3 1 a 4 1 a 5 1 a 6 1 a 7 2 a 4 2 a 5 2 a 7 3 a 6 4 a 7 Camino 1,2 1,3 1,2,4 1,2,5 1,3,6 1,2,4,7 2,4 2,5 2,4,7 3,6 4,7 Longitud 1 1 2 2 2 3 1 1 2 1 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
65
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo. Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo. n1 a nk 1 a 1 2 a 2 3 a 3 4 a 4 5 a 5 6 a 6 7 a 7 Camino 1 2 3 4 5 6 7 Longitud 0 0 0 0 0 0 0
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
66
5.1 rboles Binarios
Camino del nodo n1 a nk: Secuencia de nodos n1,, nk tal que ni es padre de ni+1 Existe un camino de todo nodo a s mismo.
// Imprime el camino de p1 a p2, si existe // Devuelve true si existe el camino entre p1 y p2 // y false en caso contrario
raz 1
2
bool camino(ArbolBinario & a,Posicion p1,Posicion p2) { if (p2==a.fin()) return false; if (p1==p2) 4 { cout << a.recupera(p1) << " "; return true; } if (camino(a,p1,a.padre(p2))) { cout << a.recupera(p2) << " "; return true; } return false; }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
67
5.1 rboles Binarios
Longitud de un camino: Nmero de nodos del camino menos 1. Existe un camino de longitud 0 de todo nodo a s mismo.
// Devuelve la longitud del camino entre p1 y p2 // o -1 si el camino no existe. int longitud(ArbolBinario &a,Posicion p1,Posicion p2) { if (p2==a.fin()) return -1; if (p1==p2) return 0; int n = longitud(a,p1,a.padre(p2)); 4 if (n==-1) return -1; return n+1; }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
68
5.1 rboles Binarios
Ascendientes: Un nodo a es ascendiente de b, si existe un camino de a a b. Todo nodo es ascendiente de s mismo. Ascendientes propios: Los ascendientes de un nodo, excluido el propio nodo. Nodo 1 Ascendientes 1 Ascendientes propios -
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
69
5.1 rboles Binarios
Ascendientes: Un nodo a es ascendiente de b, si existe un camino de a a b. Todo nodo es ascendiente de s mismo. Ascendientes propios: Los ascendientes de un nodo, excluido el propio nodo. Nodo 1 2 Ascendientes 1 1,2 Ascendientes propios 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
70
5.1 rboles Binarios
Ascendientes: Un nodo a es ascendiente de b, si existe un camino de a a b. Todo nodo es ascendiente de s mismo. Ascendientes propios: Los ascendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 Ascendientes 1 1,2 1,3 Ascendientes propios 1 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
71
5.1 rboles Binarios
Ascendientes: Un nodo a es ascendiente de b, si existe un camino de a a b. Todo nodo es ascendiente de s mismo. Ascendientes propios: Los ascendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 4 Ascendientes 1 1,2 1,3 1,2,4 Ascendientes propios 1 1 1,2
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
72
5.1 rboles Binarios
Ascendientes: Un nodo a es ascendiente de b, si existe un camino de a a b. Todo nodo es ascendiente de s mismo. Ascendientes propios: Los ascendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 4 5 Ascendientes 1 1,2 1,3 1,2,4 1,2,5 Ascendientes propios 1 1 1,2 1,2
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
73
5.1 rboles Binarios
Ascendientes: Un nodo a es ascendiente de b, si existe un camino de a a b. Todo nodo es ascendiente de s mismo. Ascendientes propios: Los ascendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 4 5 6 Ascendientes 1 1,2 1,3 1,2,4 1,2,5 1,3,6 Ascendientes propios 1 1 1,2 1,2 1,3
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
74
5.1 rboles Binarios
Ascendientes: Un nodo a es ascendiente de b, si existe un camino de a a b. Todo nodo es ascendiente de s mismo. Ascendientes propios: Los ascendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 4 5 6 7 Ascendientes 1 1,2 1,3 1,2,4 1,2,5 1,3,6 1,2,4,7 Ascendientes propios 1 1 1,2 1,2 1,3 1,2,4
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
75
5.1 rboles Binarios
Ascendientes: Un nodo a es ascendiente de b, si existe un camino de a a b. Todo nodo es ascendiente de s mismo.
// Imprime los ascendientes de p void ascendientes(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { ascendientes(a,a.padre(p)); cout << a.recupera(p) << " "; } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
76
5.1 rboles Binarios
Descendientes: Un nodo a es descendiente de b, si existe un camino de b a a. Todo nodo es descendiente de s mismo. Descendientes propios: Los descendientes de un nodo, excluido el propio nodo. Nodo 1 Descendientes 1,2,3,4,5,6,7 Descendientes propios 2,3,4,5,6,7
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
77
5.1 rboles Binarios
Descendientes: Un nodo a es descendiente de b, si existe un camino de b a a. Todo nodo es descendiente de s mismo. Descendientes propios: Los descendientes de un nodo, excluido el propio nodo. Nodo 1 2 Descendientes 1,2,3,4,5,6,7 2,4,5,7 Descendientes propios 2,3,4,5,6,7 4,5,7
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
78
5.1 rboles Binarios
Descendientes: Un nodo a es descendiente de b, si existe un camino de b a a. Todo nodo es descendiente de s mismo. Descendientes propios: Los descendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 Descendientes 1,2,3,4,5,6,7 2,4,5,7 3,6 Descendientes propios 2,3,4,5,6,7 4,5,7 6 4
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
79
5.1 rboles Binarios
Descendientes: Un nodo a es descendiente de b, si existe un camino de b a a. Todo nodo es descendiente de s mismo. Descendientes propios: Los descendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 4 Descendientes 1,2,3,4,5,6,7 2,4,5,7 3,6 4,7 Descendientes propios 2,3,4,5,6,7 4,5,7 6 4 7
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
80
5.1 rboles Binarios
Descendientes: Un nodo a es descendiente de b, si existe un camino de b a a. Todo nodo es descendiente de s mismo. Descendientes propios: Los descendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 4 5 Descendientes 1,2,3,4,5,6,7 2,4,5,7 3,6 4,7 5 Descendientes propios 2,3,4,5,6,7 4,5,7 6 4 7 -
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
81
5.1 rboles Binarios
Descendientes: Un nodo a es descendiente de b, si existe un camino de b a a. Todo nodo es descendiente de s mismo. Descendientes propios: Los descendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 4 5 6 Descendientes 1,2,3,4,5,6,7 2,4,5,7 3,6 4,7 5 6 Descendientes propios 2,3,4,5,6,7 4,5,7 6 4 7 -
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
82
5.1 rboles Binarios
Descendientes: Un nodo a es descendiente de b, si existe un camino de b a a. Todo nodo es descendiente de s mismo. Descendientes propios: Los descendientes de un nodo, excluido el propio nodo. Nodo 1 2 3 4 5 6 7 Descendientes 1,2,3,4,5,6,7 2,4,5,7 3,6 4,7 5 6 7 Descendientes propios 2,3,4,5,6,7 4,5,7 6 4 7 -
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
83
5.1 rboles Binarios
Descendientes: Un nodo a es descendiente de b, si existe un camino de b a a. Todo nodo es descendiente de s mismo.
// Imprime los descendientes de p en preorden void descendientes(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { cout << a.recupera(p) << " "; descendientes(a,a.izquierdo(p)); 4 descendientes(a,a.derecho(p)); } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
84
5.1 rboles Binarios
Hoja: Nodo sin descendientes propios. Altura de un nodo: Longitud del camino ms largo de ese nodo a una hoja. Profundidad de un nodo: Longitud del camino nico de ese nodo a la raz. Hojas: 5,6,7
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
85
5.1 rboles Binarios
Hoja: Nodo sin descendientes propios. Altura de un nodo: Longitud del camino ms largo de ese nodo a una hoja. Profundidad de un nodo: Longitud del camino nico de ese nodo a la raz. Hojas: 5,6,7 Nodo 1 Altura 3 Profundidad 0
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
86
5.1 rboles Binarios
Hoja: Nodo sin descendientes propios. Altura de un nodo: Longitud del camino ms largo de ese nodo a una hoja. Profundidad de un nodo: Longitud del camino nico de ese nodo a la raz. Hojas: 5,6,7 Nodo 1 2 Altura 3 2 Profundidad 0 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
87
5.1 rboles Binarios
Hoja: Nodo sin descendientes propios. Altura de un nodo: Longitud del camino ms largo de ese nodo a una hoja. Profundidad de un nodo: Longitud del camino nico de ese nodo a la raz. Hojas: 5,6,7 Nodo 1 2 3 Altura 3 2 1 Profundidad 0 1 1
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
88
5.1 rboles Binarios
Hoja: Nodo sin descendientes propios. Altura de un nodo: Longitud del camino ms largo de ese nodo a una hoja. Profundidad de un nodo: Longitud del camino nico de ese nodo a la raz. Hojas: 5,6,7 Nodo 1 2 3 4 Altura 3 2 1 1 Profundidad 0 1 1 2
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
89
5.1 rboles Binarios
Hoja: Nodo sin descendientes propios. Altura de un nodo: Longitud del camino ms largo de ese nodo a una hoja. Profundidad de un nodo: Longitud del camino nico de ese nodo a la raz. Hojas: 5,6,7 Nodo 1 2 3 4 5 Altura 3 2 1 1 0 Profundidad 0 1 1 2 2
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
90
5.1 rboles Binarios
Hoja: Nodo sin descendientes propios. Altura de un nodo: Longitud del camino ms largo de ese nodo a una hoja. Profundidad de un nodo: Longitud del camino nico de ese nodo a la raz. Hojas: 5,6,7 Nodo 1 2 3 4 5 6 Altura 3 2 1 1 0 0 Profundidad 0 1 1 2 2 2
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
91
5.1 rboles Binarios
Hoja: Nodo sin descendientes propios. Altura de un nodo: Longitud del camino ms largo de ese nodo a una hoja. Profundidad de un nodo: Longitud del camino nico de ese nodo a la raz. Hojas: 5,6,7 Nodo 1 2 3 4 5 6 7 Altura 3 2 1 1 0 0 0 Profundidad 0 1 1 2 2 2 3
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
92
5.1 rboles Binarios
Hoja: Nodo sin descendientes propios.
// Imprime las hojas descendientes de p void hojas(ArbolBinario & a, Posicion p) { if (p!=a.fin()) { Posicion izq=a.izquierdo(p); Posicion der=a.derecho(p); if ((izq==a.fin())&&(der==a.fin())) cout << a.recupera(p) << ; else { hojas(a,izq); hojas(a,der); } } }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
93
5.1 rboles Binarios
Altura de un nodo: Longitud del camino ms largo de ese nodo a una hoja.
// Devuelve la altura de p // Si p es fin devuelve -1 int altura(ArbolBinario & a, Posicion p) { if (p==a.fin()) return -1; int n1 = altura(a,a.izquierdo(p)); int n2 = altura(a,a.derecho(p)); if (n1>n2) return n1+1; return n2+1; }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
94
5.1 rboles Binarios
Profundidad de un nodo: Longitud del camino nico de ese nodo a la raz.
// Devuelve la profundiddad de p // Si p es fin devuelve -1 int profundidad(ArbolBinario & a, Posicion p) { if (p==a.fin()) return -1; return profundidad(a,a.padre(p))+1; }
raz 1
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
95
5.1 rboles Binarios
// Devuelve true si a1 y a2 son iguales a partir de p1 y p2 // y false en caso contrario bool iguales(ArbolBinario & a1, ArbolBinario & a2, Posicion p1, Posicion p2) { if ((p1==a1.fin())&&(p2==a2.fin())) return true; if ((p1==a1.fin())||(p2==a2.fin())) return false; if (a1.recupera(p1)!=a2.recupera(p2)) return false; if (!iguales(a1,a2,a1.izquierdo(p1),a2.izquierdo(p2))) return false; return iguales(a1,a2,a1.derecho(p1),a2.derecho(p2)); } // Cambia en a a partir de p todos los elementos iguales a e1 por e2 bool cambia(ArbolBinario & a, Posicion p, Elemento e1, Elemento e2) { if (p!=a.fin()) { Elemento e = a.recupera(p); if (e==e1) a.asigna(p,e2); cambia(a,a.izquierdo(p),e1,e2); cambia(a,a.derecho(p),e1,e2); } }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
96
5.1 rboles Binarios
// Elimina en a a partir de p todos los hijos de los nodos iguales a e bool poda(ArbolBinario & a, Posicion p, Elemento e) { if (p!=a.fin()) { if (a.recupera(p)==e) { if (a.izquierdo(p)!=a.fin()) a.suprimeIzquierdo(p); if (a.derecho(p)!=a.fin()) a.suprimeDerecho(p); } else { poda(a,a.izquierdo(p),e); poda(a,a.derecho(p),e); } } }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
97
5.1 rboles Binarios
Representacin Enlazada Hijo Izquierdo Hijo Derecho
typedef int Elemento; struct Celda { Elemento elem; Celda * izq, * der; }; typedef Celda * Posicion; class ArbolBinario { private: Celda * primera; public: ... };
primera 1
3 0
4 0
5 00
6 00
7 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
98
5.1 rboles Binarios
Celda: Operaciones de Clase Mnima
struct Celda { Elemento elem; Celda * izq, * der; Celda(Elemento e, Celda * i, Celda * d) { elem = e; izq = i; der = d; } ~Celda(); Celda(const Celda & c); }; Celda::~Celda() { if (izq!=0) delete izq; if (der!=0) delete der; } Celda::Celda(const Celda & c) { elem = c.elem; if (c.izq==0) izq = 0; else izq = new Celda(*c.izq); if (c.der==0) der = 0; else der = new Celda(*c.der); }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
99
5.1 rboles Binarios
Arbol Binario: Operaciones de Clase Mnima
ArbolBinario(Elemento e) ~ArbolBinario() ArbolBinario(const ArbolBinario & a) { primera = new Celda(e,0,0); } { delete primera; } { primera = new Celda(*a.primera); }
ArbolBinario & operator=(const ArbolBinario & a); ArbolBinario & ArbolBinario::operator=(const ArbolBinario & a) { delete primera; primera = new Celda(*a.primera); return * this; } ArbolBinario & ArbolBinario::operator=(const ArbolBinario & a) { ArbolBinario aux(a); swap(primera,aux.primera); return * this; }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
100
5.1 rboles Binarios
Representacin Enlazada Hijo Izquierdo Hijo Derecho
Posicion Posicion Posicion Posicion inicio() fin() izquierdo(Posicion p) derecho(Posicion p) const const const const { { { { return return return return primera; } 0; } p->izq; } p->der; }
Elemento recupera(Posicion p) void asigna(Posicion p, Elemento e) void void void void
const { return p->elem; } { p->elem = e; } { { { { p->izq p->der delete delete = new Celda(e,0,0); } = new Celda(e,0,0); } p->izq; p->izq = 0;} p->der; p->der = 0;}
insertaIzquierdo(Posicion p, Elemento e) insertaDerecho(Posicion p, Elemento e) suprimeIzquierdo(Posicion p) suprimeDerecho(Posicion p)
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
101
5.1 rboles Binarios
Construccin de un rbol Binario
ArbolBinario(Elemento e) { primera = new Celda(e,0,0); }
primera 1 00
ArbolBinario a(1);
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
102
5.1 rboles Binarios
Construccin de un rbol Binario
Posicion inicio() const { return primera; }
primera p1 1 00
ArbolBinario a(1); Posicion p1 = a.inicio();
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
103
5.1 rboles Binarios
Construccin de un rbol Binario
void insertaIzquierdo(Posicion p, Elemento e) { p1 p->izq = new Celda(e,0,0); }
primera 1 0
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2);
2 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
104
5.1 rboles Binarios
Construccin de un rbol Binario
void insertaDerecho(Posicion p, Elemento e) { p1 p->der = new Celda(e,0,0); }
primera 1
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3);
2 00
3 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
105
5.1 rboles Binarios
Construccin de un rbol Binario
Posicion izquierdo(Posicion p) const { return p->izq; }
primera p1 1
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1);
p2
2 00
3 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
106
5.1 rboles Binarios
Construccin de un rbol Binario
void insertaIzquierdo(Posicion p, Elemento e) { p1 p->izq = new Celda(e,0,0); }
primera 1
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4);
p2
3 00
4 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
107
5.1 rboles Binarios
Construccin de un rbol Binario
void insertaDerecho(Posicion p, Elemento e) { p1 p->der = new Celda(e,0,0); }
primera 1
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5);
p2
3 00
4 00
5 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
108
5.1 rboles Binarios
Construccin de un rbol Binario
Posicion izquierdo(Posicion p) const { return p->izq; }
primera p1 1
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5); Posicion p3 = a.izquierdo(p2);
p2
3 00
p3
4 00
5 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
109
5.1 rboles Binarios
Construccin de un rbol Binario
void insertaDerecho(Posicion p, Elemento e) { p1 p->der = new Celda(e,0,0); }
primera 1
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5); Posicion p3 = a.izquierdo(p2); a.insertaDerecho(p3,7);
p2
3 00
p3
4 0
5 00
7 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
110
5.1 rboles Binarios
Construccin de un rbol Binario
Posicion derecho(Posicion p) { return p->der; }
primera p1 1
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5); Posicion p3 = a.izquierdo(p2); a.insertaDerecho(p3,7); Posicion p4 = a.derecho(p1);
p2
p4
3 00
p3
4 0
5 00
7 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
111
5.1 rboles Binarios
Construccin de un rbol Binario
void insertaDerecho(Posicion p, Elemento e) { p1 p->der = new Celda(e,0,0); }
primera 1
ArbolBinario a(1); Posicion p1 = a.inicio(); a.insertaIzquierdo(p1,2); a.insertaDerecho(p1,3); Posicion p2 = a.izquierdo(p1); a.insertaIzquierdo(p2,4); a.insertaDerecho(p2,5); Posicion p3 = a.izquierdo(p2); a.insertaDerecho(p3,7); Posicion p4 = a.derecho(p1); a.insertaDerecho(p4,6);
p2
p4
3 0
p3
4 0
5 00
6 00
7 00
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
112
5.1 rboles Binarios
Representacin Enlazada Hijo Izquierdo Hijo Derecho Padre
struct Celda { Elemento elem; Celda * izq, * der, * padre; Celda(Elemento e,Celda *i,Celda *d,Celda *p) { elem=e;izq=i;der=d; padre=p; } ~Celda(); Celda(const Celda & c); }; Celda::~Celda() { if (izq!=0) delete izq; if (der!=0) delete der; } Celda::Celda(const Celda & c) { elem = c.elem; if (c.izq==0) izq = 0; else { izq = new Celda(*c.izq); izq->padre = this; } if (c.der==0) der = 0; else { der = new Celda(*c.der); der->padre = this; } padre = 0; }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
113
5.1 rboles Binarios
Representacin Enlazada Hijo Izquierdo Hijo Derecho Padre
ArbolBinario(Elemento e) ~ArbolBinario() ArbolBinario(const ArbolBinario & a) { primera = new Celda(e,0,0,0); } { delete primera; } { primera=new Celda(*a.primera); }
ArbolBinario & operator=(const ArbolBinario & a); ArbolBinario & ArbolBinario::operator=(const ArbolBinario & a) { delete primera; primera = new Celda(*a.primera); return * this; } ArbolBinario & ArbolBinario::operator=(const ArbolBinario & a) { ArbolBinario aux(a); swap(primera,aux.primera); return * this; }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
114
5.1 rboles Binarios
Representacin Enlazada Hijo Izquierdo Hijo Derecho Padre
Posicion Posicion Posicion Posicion Posicion inicio() fin() izquierdo(Posicion p) derecho(Posicion p) padre(Posicion p) const const const const const { { { { { return return return return return primera; } 0; } p->izq; } p->der; } p->padre; }
Elemento recupera(Posicion p) void asigna(Posicion p, Elemento e) void void void void
const { return p->elem; } { p->elem = e; } { { { { p->izq = new Celda(e,0,0,p); } p->der = new Celda(e,0,0,p); } delete p->izq; p->izq = 0;} delete p->der; p->der = 0;}
insertaIzquierdo(Posicion p, Elemento e) insertaDerecho(Posicion p, Elemento e) suprimeIzquierdo(Posicion p) suprimeDerecho(Posicion p)
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
115
5.1 rboles Binarios
rbol Binario con Excepciones
struct posicion_erronea { char * error() { return "Posicion incorrecta"; } };
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
116
5.1 rboles Binarios
rbol Binario con Excepciones
Posicion izquierdo(Posicion p) const { if (p==0) throw posicion_erronea(); return p->izq; } Posicion derecho(Posicion p) const { if (p==0) throw posicion_erronea(); return p->der; } Posicion padre(Posicion p) const { if (p==0) throw posicion_erronea(); return p->padre; }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
117
5.1 rboles Binarios
rbol Binario con Excepciones
Elemento recupera(Posicion p) const { if (p==0) throw posicion_erronea(); return p->elem; } void asigna(Posicion p, Elemento e) { if (p==0) throw posicion_erronea(); p->elem = e; }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
118
5.1 rboles Binarios
rbol Binario con Excepciones
void insertaIzquierdo(Posicion p, Elemento e) { if ((p==0)||(p->izq!=0)) throw posicion_erronea(); p->izq = new Celda(e,0,0,p); } void insertaHijoDerecho(Posicion p, Elemento e) { if ((p==0)||(p->der!=0)) throw posicion_erronea(); p->der = new Celda(e,0,0,p); }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
119
5.1 rboles Binarios
rbol Binario con Excepciones
void suprimeIzquierdo(Posicion p) { if ((p==0)||(p->izq==0)) throw posicion_erronea(); delete (p->izq); p->izq = 0; } void suprimeDerecho(Posicion p) { if ((p==0)||(p->der==0)) throw posicion_erronea(); delete (p->der); p->der = 0; }
Tecnologa de la Programacin Tema 5. Estructuras de Datos no Lineales
120
Mucho más que documentos.
Descubra todo lo que Scribd tiene para ofrecer, incluyendo libros y audiolibros de importantes editoriales.
Cancele en cualquier momento.