Sei sulla pagina 1di 10

ESTRUCTURA DE DATOS AVANZADOS

ARBOLES

ESTRUCTURA DINAMICA: RBOLES


DEFINICIN
Un rbol es una estructura no lineal en la que cada nodo puede apuntar a uno o
varios nodos.
Tambin se suele dar una definicin recursiva: un rbol es una estructura en
compuesta por un dato y varios rboles.
Esto son definiciones simples. Pero las caractersticas que implican no lo son tanto.

Definiremos varios conceptos. En relacin con otros nodos:


Nodo hijo: cualquiera de los nodos apuntados por uno de los nodos del
rbol. En el ejemplo, 'L' y 'M' son hijos de 'G'.
Nodo padre: nodo que contiene un puntero al nodo actual. En el
ejemplo, el nodo 'A' es padre de 'B', 'C' y 'D'.
Los rboles con los que trabajaremos tienen otra caracterstica importante: cada
nodo slo puede ser apuntado por otro nodo, es decir, cada nodo slo tendr un
padre. Esto hace que estos rboles estn fuertemente jerarquizados, y es lo que en
realidad les da la apariencia de rboles.
En cuanto a la posicin dentro del rbol:

Nodo raz: nodo que no tiene padre. Este es el nodo que usaremos para
referirnos al rbol. En el ejemplo, ese nodo es el 'A'.
Nodo hoja: nodo que no tiene hijos. En el ejemplo hay varios: 'F', 'H',
'I', 'K', 'L', 'M', 'N' y 'O'.
Nodo rama: aunque esta definicin apenas la usaremos, estos son los
nodos que no pertenecen a ninguna de las dos categoras anteriores. En
el ejemplo: 'B', 'C', 'D', 'E', 'G' y 'J'.

Otra caracterstica que normalmente tendrn nuestros rboles es que todos los
nodos contengan el mismo nmero de punteros, es decir, usaremos la misma
estructura para todos los nodos del rbol. Esto hace que la estructura sea ms
sencilla, y por lo tanto tambin los programas para trabajar con ellos.
En una cosa, los rboles se parecen al resto de las estructuras que hemos visto:
dado un nodo cualquiera de la estructura, podemos considerarlo como una

ESTRUCTURA DE DATOS AVANZADOS

ARBOLES

estructura independiente. Es decir, un nodo cualquiera puede ser considerado como


la raz de un rbol completo.
Existen otros conceptos que definen las caractersticas del rbol, en relacin a su
tamao:
Orden: es el nmero potencial de hijos que puede tener cada elemento de
rbol. De este modo, diremos que un rbol en el que cada nodo puede
apuntar a otros dos es de orden dos, si puede apuntar a tres ser de
orden tres, etc.
Grado: el nmero de hijos que tiene el elemento con ms hijos dentro del
rbol. En el rbol del ejemplo, el grado es tres, ya que tanto 'A' como 'D'
tienen tres hijos, y no existen elementos con ms de tres hijos.
Nivel: se define para cada elemento del rbol como la distancia a la raz,
medida en nodos. El nivel de la raz es cero y el de sus hijos uno. As
sucesivamente. En el ejemplo, el nodo 'D' tiene nivel 1, el nodo 'G' tiene
nivel 2, y el nodo 'N', nivel 3.
Altura: la altura de un rbol se define como el nivel del nodo de mayor
nivel. Como cada nodo de un rbol puede considerarse a su vez como la
raz de un rbol, tambin podemos hablar de altura de ramas. El rbol del
ejemplo tiene altura 3, la rama 'B' tiene altura 2, la rama 'G' tiene altura 1,
la 'H' cero, etc.

RBOLES BINARIOS DE BSQUEDA (ABB):


DEFINICIN
Se trata de rboles de orden 2 en los que se cumple que para cada nodo, el valor
de la clave de la raz del subrbol izquierdo es menor que el valor de la clave del
nodo y que el valor de la clave raz del subrbol derecho es mayor que el valor de la
clave del nodo.

OPERACIONES EN ABB
El repertorio de operaciones que se pueden realizar sobre un ABB es parecido al
que realizbamos sobre otras estructuras de datos, ms alguna otra propia de
rboles:

Buscar un elemento.
Insertar un elemento.

ESTRUCTURA DE DATOS AVANZADOS

ARBOLES

Borrar un elemento.
Movimientos a travs del rbol:
o Izquierda.
o Derecha.
o Raiz.
Informacin:
o Comprobar si un rbol est vaco.
o Calcular el nmero de nodos.
o Comprobar si el nodo es hoja.
o Calcular la altura de un nodo.
o Calcular la altura de un rbol.

BUSCAR UN ELEMENTO
Partiendo siempre del nodo raz, el modo de buscar un elemento se define de forma
recursiva.

Si el rbol est vaco, terminamos la bsqueda:


rbol.
Si el valor del nodo raz es igual que el del
terminamos la bsqueda con xito.
Si el valor del nodo raz es mayor que el
continuaremos la bsqueda en el rbol izquierdo.
Si el valor del nodo raz es menor que el
continuaremos la bsqueda en el rbol derecho.

el elemento no est en el
elemento que buscamos,
elemento que buscamos,
elemento que buscamos,

El valor de retorno de una funcin de bsqueda en un ABB puede ser un puntero al


nodo encontrado, o NULL, si no se ha encontrado.
INSERTAR UN ELEMENTO
Para insertar un elemento nos basamos en el algoritmo de bsqueda. Si el
elemento est en el rbol no lo insertaremos. Si no lo est, lo insertaremos a
continuacin del ltimo nodo visitado.
1. Primero se contempla el caso de que el rbol no tenga ningn elemento
(arbol==NULL) que es donde realmente insertamos el elemento.
2. Luego se asigna la memoria, el valor deseado. Inicializamos el hijo izquierdo
y derecho en NULL
3. Si existe elementos en el rbol:

Preguntamos si el elemento que se va insertar es menor que el valor


actual, en cuyo caso se insertara en la rama izquierda.

De no ser as preguntamos si el elemento a insertar es mayor que el


elemento actual, en cuyo caso lo insertamos en la rama derecha.

void inserta(ABB &arbol,int x)


{if(arbol==NULL)
{arbol=new(struct nodo);
arbol->valor=x;
arbol->izq=NULL;
arbol->der=NULL;

ESTRUCTURA DE DATOS AVANZADOS

ARBOLES

}
else if(x<arbol->valor)inserta(arbol->izq,x);
else if(x>arbol->valor)inserta(arbol->der,x);
}

ESTRUCTURA DE DATOS AVANZADOS

ARBOLES

RECORRIDO EN RBOLES BINARIOS


EN ORDEN: se visita primero el hijo izquierdo, el padre y finalmente el hijo
derecho
void enorden(ABB arbol)
{
if(arbol!=NULL)
{enorden(arbol->izq);
cout<<arbol->valor<<" ";
enorden(arbol->der);
}
}
PRE ORDEN: se visita primero el padre, luego el hijo izquierdo, y finalmente el hijo
derecho
void preorden(ABB arbol)
{
if(arbol!=NULL)
{cout<<arbol->valor<<" ";
preorden(arbol->izq);
preorden(arbol->der);
}
}
POST ORDEN: se visita primero el hijo izquierdo, luego el hijo derecho y luego el
padre.
void postorden(ABB arbol)
{
if(arbol!=NULL)
{postorden(arbol->izq);
postorden(arbol->der);
cout<<arbol->valor<<" ";
}
}
Ejemplo:
Se tiene el arbol:
7
3
1

8
5

9
6

El recorrido del rbol es:


Enorden:
1,3,5,6,7,8,9
Preorden:

7,3,1,5,6,8,9

Postorden:

1,6,5,3,9,8,7

ESTRUCTURA DE DATOS AVANZADOS

ARBOLES

Ejemplo:
Programa que realice los recorridos en PreOrden, PostOrden, InOrden, busque un elemento, busque el
elemento mayor, el menor y la operacin de Talar y Podar en un rbol de bsqueda binaria
#include<iostream.h>
#include<conio.h>
struct nodo
{
int valor;
struct nodo* izq;
struct nodo* der;
};
typedef struct nodo* ABB;
void inserta(ABB&,int);
void preorden(ABB);
void postorden(ABB);
void enorden(ABB);
void verArbol(ABB,int);
bool Buscar(ABB,int);
int BuscarMayor(ABB);
int BuscarMenor(ABB);
void Podar(ABB&,int);
void main(void)
{
ABB arbol=NULL;
int n,x,opcion;
do
{
//----------MEN PRINCIPAL----------------------cout<<" +--------------------------+"<<endl;
cout<<" |
MENU PRINCIPAL
|"<<endl;
cout<<" +--------------------------+"<<endl;
cout<<" | 1 - Ingresar Elementos |"<<endl;
cout<<" +--------------------------+"<<endl;
cout<<" +--------RECORRIDOS--------+"<<endl;
cout<<" | 2 - Preorden
|"<<endl;
cout<<" | 3 - Postorden
|"<<endl;
cout<<" | 4 - En Orden
|"<<endl;
cout<<" +--------------------------+"<<endl;
cout<<" +--------------------------+"<<endl;
cout<<" | 5 - Visualizar Arbol
|"<<endl;
cout<<" +--------------------------+"<<endl;
cout<<" +--------BUSQUEDAS---------+"<<endl;
cout<<" | 6 - Buscar Elemento
|"<<endl;
cout<<" | 7 - Buscar Mayor
|"<<endl;
cout<<" | 8 - Buscar Menor
|"<<endl;
cout<<" +--------------------------+"<<endl;
cout<<" +-----------CORTES---------+"<<endl;
cout<<" | 9 - Podar
|"<<endl;
cout<<" | 10- Talar(Elim. Arbol) |"<<endl;
cout<<" +--------------------------+"<<endl;
cout<<" | 0 - SALIR
|"<<endl;
cout<<" +--------------------------+"<<endl;
cout<<" |Ingrese su Opcion: ";cin>>opcion;
cout<<" +--------------------------+"<<endl<<endl;
switch(opcion)
{
case 1:
{
cout<<"Ingrese cantidad de elemtos del arbol: ";
cin>>n;
for(int i=0;i<n; i++)
{
cout<<"Ingrese nodo numero "<<i<<": ";
cin>>x;

ESTRUCTURA DE DATOS AVANZADOS

getch();
break;

ARBOLES

inserta(arbol,x);
}

}
case 2:
{
if(arbol!=NULL)
{
cout<<endl<<"Preorden : "; preorden(arbol);
}
else
{
cout<<" -->El arbol no tiene Elementos";
}
getch();
break;
}
case 3:
{
if(arbol!=NULL)
{
cout<<endl<<"Postorden : "; postorden(arbol);
}
else
{
cout<<" -->El arbol no tiene Elementos";
}
getch();
break;
}
case 4:
{
if(arbol!=NULL)
{
cout<<endl<<"En Orden : "; enorden(arbol);
}
else
{
cout<<" -->El arbol no tiene Elementos";
}
getch();
break;
}
case 5:
{
cout<<" VISUALIZACION DEL ARBOL "<<endl<<endl;
if(arbol!=NULL)
{
verArbol(arbol,0);
}
else
{
cout<<" -->El arbol no tiene Elementos";
}
getch();
break;
}
case 6:
{
int elem;
if(arbol!=NULL)
{
cout<<" -->Ingrese Elemento a buscar: ";
cin>>elem;

if (Buscar(arbol, elem))
cout<<" --> "<<elem<<" Encontrado ......";
else
cout<<" --> "<<elem<<" NO Encontrado ......";

ESTRUCTURA DE DATOS AVANZADOS

ARBOLES

else
{
cout<<" -->El arbol no tiene Elementos";
}
getch();
break;

}
case 7:
{
if(arbol!=NULL)
{
cout<<" -->El Mayor Elemento es: "<<BuscarMayor(arbol);
}
else
{
cout<<" -->El arbol no tiene Elementos";
}
getch();
break;
}
case 8:
{
if(arbol!=NULL)
{
cout<<" -->El Mayor Elemento es: "<<BuscarMenor(arbol);
}
else
{
cout<<" -->El arbol no tiene Elementos";
}
getch();
break;
}
case 9:
{
int corte;
if(arbol!=NULL)
{
cout<<" -->Ingrese Elemento de Corte: ";
cin>>corte;
if (Buscar(arbol, corte))
{
if (arbol->valor == corte)
arbol = NULL;
else
Podar(arbol, corte);
cout<<" El Arbol fue podado con exito......";
}
else
cout<<" El Elemento noesta en el arbol.....";
}
else
{
cout<<" -->El arbol no tiene Elementos";
}
getch();
break;
}
case 10:
{
if(arbol!=NULL)
{
arbol=NULL;
cout<<" El Arbol fue Talado con exito......";
}
else
{
cout<<" -->El arbol no tiene Elementos";
}
getch();
break;

ESTRUCTURA DE DATOS AVANZADOS

ARBOLES

}
}
clrscr();
}while(opcion!=0);
}
void inserta(ABB& arbol,int x)
{
if(arbol==NULL)
{
arbol=new(struct nodo);
arbol->valor=x;
arbol->izq=NULL;
arbol->der=NULL;
}
else
{
if(x<arbol->valor)
inserta(arbol->izq,x);
else
if(x>arbol->valor)
inserta(arbol->der,x);
}
}//SI ES IGUAL NO SE INSERTA --void preorden(ABB arbol)
{
if(arbol!=NULL)
{
cout<<arbol->valor<<" ";
preorden(arbol->izq);
preorden(arbol->der);
}
}
void enorden(ABB arbol)
{
if(arbol!=NULL)
{
enorden(arbol->izq);
cout<<arbol->valor<<" ";
enorden(arbol->der);
}
}
void postorden(ABB arbol)
{
if(arbol!=NULL)
{
postorden(arbol->izq);
postorden(arbol->der);
cout<<arbol->valor<<" ";
}
}
void verArbol(ABB arbol,int nro)
{
int i;
if(arbol==NULL)return;
verArbol(arbol->der,nro+1);
for(i=0;i<nro;i++)
cout<<" ";
cout<<arbol->valor<<endl;
verArbol(arbol->izq,nro+1);
}
bool Buscar(ABB arbol, int buscado)
{
ABB A1;
A1=arbol;
while (A1 != NULL)

ESTRUCTURA DE DATOS AVANZADOS


{
if (buscado < A1->valor )
A1 = A1->izq;
else

if (buscado > A1->valor)


A1 = A1->der;
else
return true;

}
return false;

int BuscarMenor(ABB arbol)


{
int menor;
while(arbol->izq!=NULL)
arbol=arbol->izq;
menor=arbol->valor;
return menor;
}
int BuscarMayor(ABB arbol)
{
int mayor;
while(arbol->der!=NULL)
arbol=arbol->der;
mayor=arbol->valor;
return mayor;
}
void Podar(ABB& A1, int corte)
{
while (A1 != NULL)
{
if (corte < A1->valor)
if(A1->izq->valor == corte)
{
A1->izq=NULL;
break;
}
else
A1 = A1->izq;
else
if (A1->der->valor == corte)
{
A1->der=NULL;
break;
}
else
A1 = A1->der;
}
}

10

ARBOLES

Potrebbero piacerti anche