Você está na página 1de 90

ARBOLES

• Herramienta  útil  para  describir  estructuras  que  representan 


algún tipo de jerarquía. 

• Los árboles se usan para organizar información.

• Estructura  de  datos  que  permiten  localizar  más  rápido 


información almacenada.

1
ARBOLES
• En  el  mundo  de  la  informática,  los  árboles  se  utilizan  en 
distintos ámbitos :

• Búsqueda en un disco duro. 
• Estructura  de  directorios  y  subdirectorios  en  forma 
de árbol para organizar la información. 

• Esquemas para el desarrollo de algoritmos, tales como la 
programación dinámica, esquema divide y vencerás, etc.

2
ARBOLES – Definiciones 

• En  forma  general,  se  puede  definir  a  un  árbol  como  una 
colección de elementos, llamados nodos, uno de los cuales 
se distingue como raíz, junto con una relación, padre­hijo, 
que coloca a todos los nodos en una estructura jerárquica. 

• Un árbol es una estructura de datos no lineal y homogénea 
en  el  que  cada  nodo  puede  tener  varios  nodos  sucesores, 
pero tan sólo puede tener un nodo antecesor.

3
ARBOLES – Definiciones 
• Un árbol dirigido es una estructura jerárquica, organizada 
y dinámica:
• Jerárquica porque los componentes están en niveles  
distintos.
• Organizada  porque  importa  la  forma  en  que  este 
dispuesto el contenido.
• Dinámica  porque  su  forma,  tamaño  y  contenido 
pueden variar durante la ejecución.
• Un árbol se define recursivamente diciendo que es :
• O vacío,
• O  con  un  componente  raíz,  al  que  están  unidos  un 
número finito de árboles disjuntos. 

4
n

  n1  n2  .....   nk


.....
 T1  T 2 T k 

Para este árbol, n es la raíz y T1,...,Tk son subárboles de la raíz, 
donde los nodos n1,..., nk  son conocidos como hijos de n. Note 
que estos nodos son las raíces de los subárboles Ti.

5
A
A

B C B

D E F D

G Ejemplo 2
H

Ejemplo 1

Ejemplo 3

6
Raíz   A

 B  C  D

 E  F  G  H  I  J

 K  L  M

Ejemplo 4

7
ARBOLES ­ Algunas definiciones 
• Nodo Padre de un nodo es aquel que apunta al nodo. 
• En un árbol cada nodo sólo puede tener un padre. 
• En el ejemplo 1, A es el padre de B y C, y a su vez, B es 
el padre de D.
• Nodo Hijo es cualquier nodo apuntado por el nodo padre. 
• Un nodo puede tener varios hijos. 
• En el ejemplo 1, B y C son los nodos hijos de A y todos 
los nodos tienen uno o dos hijos.
• Nodo Raíz es el único nodo del árbol que no tiene padre. 
• En  la  representación  utilizada,  el  nodo  raíz  es  el  que  se 
encuentra en la parte superior del árbol.

8
ARBOLES ­ Algunas definiciones 

• Si  existe  un  camino  del  nodo  1  a  un  nodo  2,  entonces  2  es 
descendiente de 1 y 1  es antecesor o ancestro de 2. 
• La raíz es el único nodo sin antecesor. 

• Los  nodos  que  no  tienen  descendientes,  se  llaman  hojas  del 
árbol o nodos terminales.

9
ARBOLES ­ Algunas definiciones
• Hojas son todos los nodos que no tienen hijos. 
• En  la  representación  del  ejemplo 1  son  hojas  los  nodos 
situados en la parte inferior: D, G, H y F.
• Nodos Interiores son los nodos que no son ni el nodo raíz, ni 
nodos hoja. 
• En el ejemplo 1, son nodos interiores B, C y E.

• Camino si n1, ..., nk  es una secuencia de nodos en un árbol tal 
que ni  es padre de ni+1  para 1≤ i < k, entonces tal secuencia es 
llamada camino desde el nodo n1 al nodo nk . 
• En el ejemplo 1 A­B­D es un camino, al igual que E­G y 
C­E­H.

10
ARBOLES ­ Algunas definiciones

• Se define el largo del camino como el número de enlaces que 
hay desde el primer nodo hasta el último,
• el número de nodos menos uno.

• Rama es un camino desde el nodo raíz a una hoja. 
• En el ejemplo 1, A­C­E­G y A­C­ F son ramas.

11
ARBOLES ­ Algunas definiciones

• Altura  de  un  árbol  es  el  máximo  número  de  enlaces  de  las 
ramas del árbol.

• La  altura  del  árbol  del  ejemplo 1  es  3,  ya  que  esa  es  la 
longitud  de  la  rama  A­C­E­H,  que  junto  a  A­C­E­G  son 
las más largas.

12
ARBOLES ­ Algunas definiciones

• Grado de un árbol es el número máximo de hijos que tienen 
los nodos del árbol. 
• En el ejemplo 4 el árbol es de grado tres. 
• Una lista no es más que un árbol de grado uno, tal y como 
se puede ver en los ejemplos 2 y 3.
• Grado  de  un  nodo  :  Es  el  número  de  subárboles  (llamados 
nodos hijos) de un nodo.
• El grado de las hojas es cero.
• Profundidad de un nodo :  Es el largo del único camino desde 
la raíz a ese nodo.

13
ARBOLES ­ Algunas definiciones
• Nivel de un nodo, es el número de nodos del camino desde la 
raíz hasta dicho nodo. 
• Por  convención  al  nodo  raíz  de  árbol  se  le  considera  el 
nivel cero del árbol.
• En el árbol del ejemplo 1, A tiene nivel 1; B y C tienen nivel 
2; D, E y F tienen nivel 3 y G y H tienen nivel 4.
• Bosque colección de dos o más árboles :

C
B
E F
D
G H

14
ARBOLES ­ Algunas definiciones
Árbol  completo  :  si  todo  nodo  no  terminal  tiene  asociado 
exactamente el grado del árbol.

10

15 20

25 12 14 9

2 14 17 4 37 34

15
ARBOLES ­ Algunas definiciones
Árbol  lleno  :    si  es  completo  y  todas  sus  hojas  están  en  el 
mismo nivel.

10

15 20

25 12 14 9

2 14 5 16 17 4 37 34

16
ARBOLES ­ Algunas definiciones
Árbol  casi­lleno: Es  cuando  un  árbol  esta  lleno  hasta  el 
penúltimo nivel  y las hojas que están en el 
último nivel se ubican lo más a la izquierda 
posible.

10

15 20

25 12 14 9

2 14 5

17
ARBOLES ­ Algunas definiciones
Árboles  Isomorfos:  Se  dice  que  dos  árboles  son  isomorfos  si 
poseen  una  estructura  idéntica,  pero  no 
necesariamente los mismos elementos.

15

25 12
 5 34

2 14
9 23

18
ARBOLES ­ Algunas definiciones
Árboles  semejantes: Son  aquellos  árboles  que  poseen  los 
mismos  elementos,  pero  no 
necesariamente  la  misma  estructura  de 
árboles.  Los  elementos  no  deben  estar 
necesariamente en el mismo orden. 

15 14 

25 12 25 2

2 14 12 15

19
Arboles ­ Operaciones
• El conjunto  de  operaciones que se pueden realizar sobre un 
árbol  es  parecido  a  las  realizadas  sobre  otras  estructuras  de 
datos, más otras propias de árboles:
• Buscar un elemento. 
• Insertar un elemento. 
• Borrar un elemento. 
• Izquierda. 
• Derecha. 
• Comprobar si un árbol está vacío. 
• Calcular el número de nodos. 
• Comprobar si el nodo es hoja. 
• Calcular la altura de un nodo. 
• Calcular la altura de un árbol.
• Etc. 20
Arboles ­ Representaciones

• Formas básicas de representar los árboles :

• Arreglos.

• La representación hijo más izquierdo y hermano derecho.
• La representación hijo izquierdo, hijo derecho.

• Listas generalizadas.

21
Arboles – Representaciones : 
Hijo izquierdo, Hijo derecho
• Esta representación se basa en una estructura de nodos con dos 
punteros : 
• Uno destinado al hijo izquierdo y 
• Otro al hijo derecho.

• Declaración : izq info der


struct nodoAr
{ tElemento info;
struct nodoAr* izq; 
struct nodoAr* der;
}; 
typedef nodoAr tArbol;
22
EJEMPLO
A

B C

D E F
izq info der
G A
H

B C

D E F

G H

23
ARBOLES
• Se definen en una gran variedad de tipos y categorías.

• De acuerdo al número de arcos que parten de cada nodo en un 
árbol, este se puede clasificar en :

• Árboles Binarios, 
• Árboles de Búsqueda Binarios,
• Árboles AVL
• Árboles2­3, 
• Árboles2­3­4,
• Árboles Rojo­Negro, 
• Árboles B, etc.
24
Arboles Binarios

B C

D E F

G
H

25
Arboles Binarios

Definición 1 :
Un Árbol binario es un árbol de grado 2.

Definición 2 :
Un Árbol binario es aquel que :
a)  Es vacío, ó
b)  Está  formado  por  un  nodo  cuyos  subárboles  izquierdo  y 
derecho son a su vez árboles binarios.

26
Arboles Binarios ­ Implementaciones

Implementación dinámica mediante punteros
• La  representación  de  cada  nodo  en  esta  implementación  será 
una estructura de tres campos, los enlaces serán punteros a los 
subárboles izquierdo y derecho de cada nodo. 
• Estructura de datos en C para definir un árbol binario :

struct nodoAr {
tElemento info;
struct nodoAr * izq, *der;
} info
izq info der
typedef nodoAr tAB;  
izq der

27
Arboles Binarios ­ Implementaciones
• De este modo, un árbol se identifica con un puntero a su nodo 
raíz, a través del cual se puede acceder a sus nodos.

B C

D E F

G H

28
Arboles Binarios ­ Implementaciones

void CrearArbol (tAB **A)
{
*A = Null;
}

• Para  crear  un  árbol  hacer  que  el  puntero  a  su 


nodo raíz apunte a Null.

29
Arboles Binarios ­ Implementaciones

boolean ArbolVacio (tAB *A)
{
return (A == Null);
}

• Se  considera  que  un  árbol  está  vacío  cuando  el 


puntero a su nodo raíz apunta a Null.

30
Arboles Binarios ­ Implementaciones

void SubArbolIzq (tAB *A; tAB **subizq)
{
*subizq = A­>izq;
}

• Para acceder al subárbol izquierdo de un árbol, basta 
con acceder al puntero al hijo izquierdo de su nodo 
raíz.

31
Arboles Binarios ­ Implementaciones

void SubArbolDer (tAB *A; tAB **subder)
{
*subder = A­>der;
}

• Para acceder al subárbol derecho de un árbol, basta 
con  acceder  al  puntero  al  hijo  derecho  de  su  nodo 
raíz.

32
Arboles Binarios ­ Implementaciones

void DatoRaiz (tAB *A, tElemento *d)
{ // pasado como parámetro
d = A­>info ;
}

• Para acceder al dato contenido en el nodo raíz de un 
árbol,  basta  con  acceder  al  campo  info del 
registro que lo representa.

tElemento DatoRaiz (TArbol *A)
{   //   retornado como valor
return( A­>info );
}
33
Recorridos en Arboles Binarios

• En el caso de los árboles binarios, el recorrido de sus nodos 
se debe realizar en tres pasos:
• acceder a la información de un nodo dado,
• acceder a la información del subárbol izquierdo de dicho 
nodo,
• acceder a la información del subárbol derecho de dicho 
nodo.
• Obs.: estos tres pasos no indican una secuencia a seguir.
    acceder será sinónimo de imprimir.

• Existen tres tipos básicos de recorridos: PreOrden, InOrden, 
PostOrden. 

34
Recorridos en Arboles Binarios
• Preorden:  primero  se  accede  a  la  información  del  nodo, 
después al subárbol izquierdo y después al subárbol derecho.

A A ­ B ­ D ­ C ­ E ­ G ­ H ­ F

B C

D E F

G
H

35
Arboles Binarios ­ Implementación

void PreOrden (tAB *A)
{
if (A != NULL)
{ printf("%d ",A­>info); // suponiendo que tElemento es int
PreOrden(A­>izq); //  recorrido por la izquierda
PreOrden(A­>der); //  recorrido por la derecha
}
}

36
Recorridos en Arboles Binarios
• Inorden:  primero  se  accede  a  la  información  del  subárbol 
izquierdo,  después  se  accede  a  la  información  del  nodo  y,  por 
último, se accede a la información del subárbol derecho.

A
D ­ B ­ A ­ G ­ E ­ H ­ C ­ F
B C

D E F

G
H

37
Arboles Binarios ­ Implementación

void InOrden (tAB *A)
{
if (A != NULL)
{ InOrden(A­>izq); //  recorrido por la izquierda
printf("%d ",A­>info); // suponiendo que tElemento es int
InOrden(A­>der); //  recorrido por la derecha
}
}

38
Recorridos en Arboles Binarios
• Postorden:  primero  se  accede  a  la  información  del  subárbol 
izquierdo,  después  a  la  del  subárbol  derecho  y,  por  último,  se 
accede a la información del nodo.

B C

D E F

G
H D ­ B ­ G ­ H ­ E ­ F ­ C ­ A

39
Arboles Binarios ­ Implementación

void PostOrden (tAB *A)
{
if (A != NULL)
{ PostOrden(A­>izq); //  recorrido por la izquierda
PostOrden(A­>der); //  recorrido por la derecha
 printf("%d ",A­>info); // suponiendo que tElemento es int
}
}

40
Reconstrucción de Arboles

• Es  posible  reconstruir  la  estructura  de  un  árbol  dado  su 
recorrido inorden y postorden ó inorden y preorden.
• inorden es imprescindible.

41
Reconstrucción de Arboles

Ejemplo : dados los siguientes recorridos 

InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10 

reconstruir el árbol binario, que originó ambos recorridos.

42
Reconstrucción de Arboles
Solución :

InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10 
Paso 1: 

InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50

30 – 60 – 20 – 80 – 70 – 40 90 – 50

43
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10 
Paso 2: 
InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50

30 – 60 – 20 – 80 – 70 – 40 90 – 50

50

44
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10 

Pasos 3 y 4: 

InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50

30 – 60 – 20 – 80 – 70 – 40 90 – 50

30 – 60 80 – 70 – 40 50

45
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10 

Paso 5 : 

InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50

30 – 60 – 20 – 80 – 70 – 40 90 – 50

30 – 60 80 – 70 – 40 50

80 – 70

46
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10 

Pasos 6 y 7: 

InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50

30 – 60 – 20 – 80 – 70 – 40 90 – 50

30 – 60 80 – 70 – 40 50

80 – 70

80

47
Reconstrucción de Arboles
InOrden (IRD): 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50
PostOrden (IDR) : 60 – 30 – 80 – 70 – 40 – 20 – 50 – 90 – 10 

Pasos 8 y 9: 

InOrden : 30 – 60 – 20 – 80 – 70 – 40 – 10 – 90 – 50

30 – 60 – 20 – 80 – 70 – 40 90 – 50

30 – 60 80 – 70 – 40 50

60 80 – 70

80

48
Reconstrucción de Arboles

Finalmente :
10

20 90

30 40 50

60 70

80

49
Reconstrucción de Arboles

• Ejemplo :

InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90 

50
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Paso 1: 
InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10

50 – 30 – 60 – 20 – 80 – 70 – 90 – 40

51
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Paso 2: 

InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10

50 – 30 – 60 – 20 – 80 – 70 – 90 – 40

50 – 30 – 60 80 – 70 – 90 – 40

52
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Pasos 3, 4 y 5: 

InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10

50 – 30 – 60 – 20 – 80 – 70 – 90 – 40

50 – 30 – 60 80 – 70 – 90 – 40

50 60

53
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Paso 6: 

InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10

50 – 30 – 60 – 20 – 80 – 70 – 90– 40

50 – 30 – 60 80 – 90 – 70 – 40

50 60 80 – 70 – 90

54
Reconstrucción de Arboles
Solución :
InOrden (IRD) : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10
PreOrden (RID) : 10 – 20 – 30 – 50 – 60 – 40 – 70 – 80 – 90
Pasos 7, 8 y 9  :
InOrden : 50 – 30 – 60 – 20 – 80 – 70 – 90 – 40 – 10

50 – 30 – 60 – 20 – 80 – 70 – 90– 40

50 – 30 – 60 80 – 70 – 40 – 90

50 60 80 – 70 – 90

80 90

55
Reconstrucción de Arboles
Finalmente :
10

20

30 40

50 60 70

80 90

56
Ejercicios

int ContarHojas (tAB *arb)
{ //  Determina el número de hojas en un árbol binario.
if (arb == NULL)
return 0;
else 
if( (arb ­>izq == NULL) && (arb ­>der == NULL) )
return 1;
else
return(ContarHojas(arb ­>izq) + ContarHojas(arb ­>der));
}

57
Ejercicios

int altura (tAB *arb)
{ //  Calcula la altura de un árbol binario.
if arb == NULL
return ­1;
else 
return (1+ max(altura(arb ­> izq),altura(arb ­> der)));
}

58
Ejercicios
struct Nodo {
   tElemento info;
   struct Nodo *izq, *der;
        }

struct Nodo *Copiar(struct Nodo *T)
//  copia ArBin T, retornando dirección de copia
{ struct Nodo *Q =NULL;
if (T ! (NULL)
{ Q = (struct Nodo *) malloc (sizeof (struct Nodo));
Q ­> dato = T ­> dato;
Q ­> izq = Copiar (T ­> izq);
Q ­> der = Copiar (T ­> der);
}
return Q;
}
59
Ejercicios
int Igual (struct Nodo *S, struct Nodo *T)
//  verifica que  los árboles S y T sean iguales : true (1) 
{
int ans = 0;
if ((S = NULL) && (T=NULL))
ans = 1;
if ((S!= NULL) && (T!=NULL))
{ if (S ­> dato == T ­> dato)
ans = Igual (S ­> izq, T ­> izq);
if (ans)
ans = Igual (S ­> der, T ­> der);
}
return ans;
}
60
Ejercicios Propuestos

• Escribir una función en C para calcular el peso de un árbol 
binario. (El peso se define como el número de nodos).
• Escribir  una  función  en  C  para  determinar  si  un  elemento 
cualquiera pertenece a un árbol binario.
• Escribir una función en C para calcular el número de veces 
que aparece un elemento en un árbol binario.

61
Aplicación
• Una de las aplicaciones de la correspondencia entre árboles 
y  árboles  binarios  es  la  representación  de  expresiones 
aritméticas usando NOTACION POLACA.

• Usada en compiladores,  ya que es más fácil traducir de 
notación polaca a instrucciones de máquina.

62
Aplicación
• Para el siguiente árbol de expresión algebraica:
+

* E

/ D

A ** Inorden :  A/B** C* D+E  (infijo)
Preorden :  +*/A**BCDE    (prefijo)
B C Postorden :  ABC**/ D*E+   (postfijo) 

63
Ejercicios Propuestos

1. Dibujar el árbol binario que representa las siguientes expresiones:
a) a * (b + c / ((x ­ 1) * (y + 4))) + x * x ­ 24
b) a0 + x * (a1 + x * (a2 + x * a3))

1. Reconstruir un árbol binario a partir de los siguientes recorridos :
a)  Preorden: 2, 5, 3, 9, 7, 1, 6, 4, 8.
     Inorden: 9, 3, 7, 5, 1, 2, 6, 8, 4.

b)  Inorden: 5, 6, 12, 10, 1, 9, 13, 4, 8, 2, 7, 3, 11.
     Postorden: 6, 5, 10, 9, 1, 13, 12, 2, 8, 3, 11, 7, 4.

64
Ejercicios
Hacer una función en C que escriba todos los caminos que van desde la raíz 
a cada una de las hojas, suponiendo que cada nodo contiene un carácter. 
Por ejemplo, en el árbol :

deberían obtenerse 
O I
las palabras: 
L K T R S
MOLER, MOLA, 
MOKA, MOTA,  E A A A R O A T
MIRRA, MIRO, 
MISA y MÍSTICO. O I
R A

O
65
Arboles de Búsqueda Binaria 

15

9 27

3 21 30

18
24

66
ABB ­ Definición

• No  basta  con  almacenar  la  información  en  un  árbol  para 
facilitar  la  búsqueda,  se  debe  utilizar  un  tipo  especial  de 
árbol: un árbol binario de búsqueda. 

• Si  además  se  quiere  que  la  búsqueda  sea  lo  más  eficiente 
posible  se  deben  utilizar  árboles  de  búsqueda  binarios 
equilibrados.

67
ABB ­ Definición

Un árbol binario de búsqueda es una estructura de datos en el 
que para todos sus nodos, el hijo izquierdo, si existe, contiene 
un valor menor que el nodo padre y el hijo derecho, si existe, 
contiene un valor mayor que el del nodo padre.
15

9 27

3 21 30

18
24

68
ABB – Búsqueda de un elemento

• Suponga que se busca un elemento x en el árbol. 
• Lo  primero  que  será  comprobar  si  se  encuentra  en  el  nodo 
raíz. 
• Si  no  es  así,  si  el  elemento  buscado  es  menor  que  el 
contenido en el nodo raíz se deduce que, de estar en el árbol, 
se encuentra en el subárbol izquierdo. 
• Si el elemento buscado es mayor que el contenido en el nodo 
raíz  se  deduce  que,  de  estar  en  el  árbol,  se  encuentra  en  el 
subárbol derecho. 
• Para continuar la búsqueda en el subárbol adecuado se aplica 
recursivamente el mismo razonamiento.

69
ABB – Búsqueda de un elemento

• El esquema del algoritmo BuscarNodo será el siguiente :

1. Si  el  valor  del  nodo  actual  es  igual  al  valor  buscado   
encontrado.
2. Si  el  valor  buscado  es  menor  que  el  del  nodo  actual   
inspeccionar el subárbol izquierdo.
3. Si  el  valor  buscado  es  mayor  que  el  del  nodo  actual   
inspeccionar el subárbol derecho.
4. Si el valor no está en el árbol  no encontrado.

70
ABB – Búsqueda de un elemento ­ Implementación :
tAB* BuscarNodo (tAB *A; tElemento x)
{  tAB p;
BOOLEAN enc;
p = A;
enc = false;
while ( ( ! enc) && ( p!= NULL ) )
{ enc = p ­> info == x;
if ! enc  
if (x < p ­> info )   p = SubArbolIzq(p);
else p = SubArbolDer(p);
}
Si el resultado devuelto es NULL, significa 
return p; que no se ha encontrado el elemento buscado
}
71
ABB ­ Inserción
• La inserción de un elemento está basado en el algoritmo de 
búsqueda. 
• Se determina si el elemento está en el árbol,
• Si está, no se inserta. 
• En caso contrario, se agrega como hoja.

72
ABB ­ Inserción
• Ciclo  :  mientras  no  sea  un  árbol  vacío  o  hasta  que  se 
encuentre el elemento. 
• Si el valor del nodo raíz es mayor que el elemento buscado, 
continuar la búsqueda en el árbol izquierdo: 
• Padre = nodo
• nodo = nodo ­> izq 

• Si el valor del nodo raíz es menor que el elemento buscado, 
continuar la búsqueda en el árbol derecho: 
• Padre = nodo
• nodo = nodo ­> der  

73
ABB – Ejercicios
Ejemplo:  Dadas las siguientes secuencias, construir el ABB 
correspondiente :

1. 10 – 5 – 7 – 14 – 12 – 18 – 15
2. Determinar recorrido InOrden – Postorden – PreOrden.

3. 15 – 18 – 4 – 5 – 10 – 12 – 7
4. Determinar recorrido en InOrden – Postorden – PreOrden.

74
ABB – Ejercicios
Para : 10 – 5 – 7 – 14 – 12 – 18 – 15
Arbol vacío Insertar 10 :

NULL 10

Insertar 5 : Insertar 7 :

10
10

5
5

75
ABB – Ejercicios
Para : 10 – 5 – 7 – 14 – 12 – 18 – 15

Insertar 14 : Insertar 12 : Insertar 18 :

10 10 10

5 14 5 14 5 14

7 7 12 7 12 18

76
ABB – Ejercicios
Para : 10 – 5 – 7 – 14 – 12 – 18 – 15

Insertar 15 :

InOrden : 5 – 7 – 10 – 12 – 14 – 15 ­ 18
10

5 14

7 12 18

15

77
ABB – Ejercicios
Para : 15 – 18 – 4 – 5 – 10 – 12 – 7
Arbol vacío Insertar 15 :

NULL 15

Insertar 18 : Insertar 4 :

15
15

4 18
18

78
ABB – Ejercicios
Para : 15 – 18 – 4 – 5 – 10 – 12 – 7

Insertar 5 : Insertar 10 : Insertar 12 :

15 15 15

4 18 4 18 4 18

5 5 5

10 10

12

79
ABB – Ejercicios
Para : 15 – 18 – 4 – 5 – 10 – 12 – 7

Insertar 7 :

15
InOrden : 4 – 5 – 7 – 10 – 12 – 15 – 18

4 18

10

7 12

80
ABB – Inserción ­ Implementación
void InsertarNodo (tAB **A; tElemento x)
{ if (*A == NULL )   
 { *A = (tAB *) malloc(sizeof(tAB));
(*A )­>info = x;
(*A )­>izq = NULL;
(*A )­>der = NULL;
}
else
if( (*A) ­> info > x)
InsertarNodo(&(*A) ­> izq, x);
else
if( (*A) ­> info < x)
I InsertarNodo(&(*A) ­> der, x);
else
printf( “Dato repetido  “); 81
}
ABB – Eliminar
1. Buscar el nodo que se desea borrar.
2. Si  se  encuentra  el  nodo  hay  que  contemplar  tres  casos 
posibles:
a) Si el nodo a borrar no tiene hijos  se libera el espacio 
que ocupa.
b) Si el nodo a borrar tiene un hijo  este hijo ocupa  la 
posición ocupada por el nodo  borrar.
c) Si el nodo a borrar tiene dos hijos 
i. Se  busca  el  máximo  de  la  rama  izquierda,  o  el 
mínimo de la rama derecha.
ii. Se  sustituye  el  nodo  a  borrar  por  el  nodo 
encontrado (máximo o mínimo).
iii. Se elimina el nodo copiado (máximo o mínimo).
82
ABB – Eliminar; caso a
Si el nodo a borrar no tiene hijos  se libera el espacio que ocupa.

Árbol Inicial:
Árbol Final:
15 15

9 27 9 27

21 36 21 36
12 12

18 24 18
Suprimir 24

83
ABB ­ Eliminar ; caso b
Si  el  nodo  a  borrar  tiene  un  hijo    este  hijo  ocupa  la  posición 
ocupada por el nodo  borrar.

Árbol Inicial: Árbol Final:
15
15
9 27
9 27
21 36
12 18
12 36

18
Suprimir 21

84
ABB – Eliminar; caso c
Si el nodo a borrar tiene dos hijos 
i. Se  busca  el  máximo  de  la  rama  izquierda  o  el  mínimo  de  la 
rama derecha.
ii. Se sustituye el nodo a borrar por el nodo encontrado.
Árbol Inicial: Árbol Final:

Suprimir 15 12
15
9 27
9 27
18 36
18 36
12

85
ABB – Ejercicios
Para el árbol inicial, eliminar las claves 24 – 21 – 15 – 27 – 12.

Arbol inicial : Suprimir 24 (caso a):

15 15

9 27 9 27

12 21 36 12 21 36

18 24 18

86
ABB – Ejercicios

Arbol inicial : Suprimir 21 (caso b):

15 15

9 27 9 27

12 21 36 12 18 36

18

87
ABB – Ejercicios Arbol inicial :
15

Suprimir 15 (caso c):
9 27
Dos soluciones posibles :

12 18 36
12

9 27
18

18 36
9 27

12 36

88
ABB – Ejercicios

Arbol inicial : Suprimir 27 (caso c):

12
12

9 18
9 27

36
18 36

89
ABB – Ejercicios

Arbol inicial : Suprimir 12 (caso c):

12 9

9 18 18

36
36

90

Você também pode gostar