Está en la página 1de 120

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