Coruniversitaria, Corporación
Universitaria de Ibagué
Facultad de Ingeniería de Sistemas
|
|
|
| Nodo | Adyacentes |
|
A |
F C B |
| B | G C |
| C | F |
| D | C |
| E | D C J |
| F | D |
| G | C E |
| J | D K |
| K | E G |
Búsqueda por expansión (o por anchura):
1. Iniciar todos los nodos a Estado = 1
2. Acolar el nodo de partida y cambiar su estado a Estado = 2
3. Repetir pasos 4 y 5 hasta que cola = vacía
4. Desacolar nodo, procesar nodo y cambiar a Estado = 3
5. Acolar los vecinos del nodo cuyo Estado = 1 y cambiar a Estado = 2
6. Salir
A F C B D G E J K
Búsqueda por profundidad
1.Iniciar todos los nodos a Estado = 1
2. Apilar el nodo de partida y cambiar su estado a Estado = 2
3. Repetir pasos 4 y 5 hasta que pila = vacía
4. Desapilar nodo, procesar nodo y cambiar a Estado = 3
5. Apilar los vecinos del nodo cuyo Estado = 1 y cambiar a Estado = 2
6. Salir
A B G E J K D C F
***************************************************************
// Software básico para manejo de árboles AVL
#include "iostream.h"
#include "alloc.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define TRUE 1
#define FALSE 0
#define MARCA -1
#define IZQ 1
#define BAL 0
#define DER -1
#define MAX 100
typedef int TipoAVL;
typedef struct NodoAVL
{ TipoAVL info;
struct NodoAVL *izq, *der;
int balan;
} TAVL,*AVL;
typedef AVL TipoC;
typedef struct
{ TipoC info[ MAX ];
int primero,
ultimo;
} TCola, *Cola;
typedef TipoAVL TipoL;
typedef struct ListaNodo
{ TipoL info;
struct ListaNodo *ant, *sig;
} *pListaNodo;
typedef struct
{ pListaNodo primero, ultimo, ventana;
int longitud;
} TLista, *Lista;
typedef pListaNodo Ventana;
Cola inicCola( void )
{ Cola col;
col = ( Cola )malloc( sizeof( TCola ) );
col->primero = col->ultimo = -1;
return col;
}
void adicCola( Cola col, TipoC elem )
{ if ( col->primero == -1 )
{ col->info[ 0 ] = elem;
col->primero = col->ultimo = 0;
}
else
{ col->ultimo = ( col->ultimo + 1 ) % MAX;
col->info[ col->ultimo ] = elem;
}
}
void elimCola( Cola col )
{ if ( col->primero == col->ultimo )
col->primero = col->ultimo = -1;
else
col->primero = ( col->primero + 1 ) % MAX;
}
TipoC infoCola( Cola col )
{ return col->info[ col->primero ];
}
int vaciaCola( Cola col )
{ return col->primero == -1 && col->ultimo == -1;
}
void destruirCola( Cola col )
{ free( col );
}
Lista inicLista( void )
{ Lista resp;
resp = ( Lista )malloc( sizeof( TLista ) );
resp->primero = resp->ultimo =resp->ventana= NULL;
resp->longitud = 0;
return resp;
}
void anxLista( Lista lst, TipoL elem )
{ pListaNodo nuevo = ( pListaNodo )malloc( sizeof( struct ListaNodo ) );
nuevo->info = elem;
nuevo->ant = nuevo->sig = NULL;
if ( lst->longitud == 0 )
lst->primero = lst->ultimo = nuevo;
else if ( lst->ventana == lst->ultimo )
{ lst->ventana->sig = lst->ultimo = nuevo;
nuevo->ant = lst->ventana;
}
else
{ nuevo->ant = lst->ventana;
nuevo->sig = lst->ventana->sig;
lst->ventana->sig->ant = nuevo;
lst->ventana->sig = nuevo;
}
lst->ventana = nuevo;
lst->longitud++;
}
void insLista( Lista lst, TipoL elem )
{ pListaNodo nuevo = ( pListaNodo )malloc( sizeof( struct ListaNodo ) );
nuevo->info = elem;
nuevo->ant = nuevo->sig = NULL;
if ( lst->longitud == 0 )
lst->primero = lst->ultimo = nuevo;
else if ( lst->ventana == lst->primero )
{ lst->primero = lst->ventana->ant = nuevo;
nuevo->sig = lst->ventana;
}
else
{ nuevo->sig = lst->ventana;
nuevo->ant = lst->ventana->ant;
lst->ventana->ant->sig = nuevo;
lst->ventana->ant = nuevo;
}
lst->ventana = nuevo;
lst->longitud++;
}
void elimLista( Lista lst )
{ pListaNodo aux;
if ( lst->ventana == lst->primero )
{ if ( lst->ultimo == lst->primero )
lst->ultimo = NULL;
lst->primero = lst->primero->sig;
free( lst->ventana );
lst->ventana = lst->primero;
}
else
{ if ( lst->ultimo == lst->ventana )
lst->ultimo = lst->ultimo->ant;
lst->ventana->ant->sig = lst->ventana->sig;
if ( lst->ventana->sig != NULL )
lst->ventana->sig->ant = lst->ventana->ant;
aux = lst->ventana;
lst->ventana = lst->ventana->sig;
free( aux );
}
lst->longitud--;
}
void sigLista( Lista lst )
{ lst->ventana = lst->ventana->sig;}
void primLista( Lista lst )
{ lst->ventana = lst->primero;}
void posLista( Lista lst, int pos )
{ int i;
for ( lst->ventana = lst->primero, i = 1; i < pos; i++ )
lst->ventana = lst->ventana->sig;
}
TipoL infoLista( Lista lst )
{ return lst->ventana->info;}
int longLista( Lista lst )
{ return lst->longitud;}
int finLista( Lista lst )
{ return lst->ventana == NULL;}
void destruirLista( Lista lst )
{ pListaNodo p, q;
for( p = lst->primero; p != NULL; )
{ q = p;
p = p->sig;
free( q );
}
free( lst );
}
AVL inicAVL( void )
{ return NULL;}
AVL roteIzq( AVL a )
{ AVL temp=a->der;
a->der=temp->izq;
temp->izq=a;
return temp;
}
static AVL roteDer( AVL a )
{ AVL temp=a->izq;
a->izq=temp->der;
temp->der=a;
return temp;
}
AVL roteDerIzq( AVL a )
{ a->der=roteDer( a->der );
return roteIzq( a );
}
static AVL roteIzqDer( AVL a )
{ a->izq=roteIzq( a->izq );
return roteDer( a );
}
AVL balanceaDer( AVL a )
{ if( a->der->balan==DER )
{ // Caso 2
a->balan=a->der->balan=BAL;
a=roteIzq( a );
}
else
{ // Caso 4
switch( a->der->izq->balan )
{ case IZQ: a->balan=BAL;
a->der->balan=DER;
break;
case BAL: a->balan=a->der->balan=BAL;
break;
case DER: a->balan=IZQ;
a->der->balan=BAL;
break;
}
a->der->izq->balan=BAL;
a=roteDerIzq( a );
}
return a;
}
AVL balanceaIzq( AVL a )
{ if( a->izq->balan==IZQ )
{ // Caso 3
a->balan=a->izq->balan=BAL;
a=roteDer( a );
}
else
{ // Caso 5
switch( a->izq->der->balan )
{ case IZQ: a->balan=DER;
a->izq->balan=BAL;
break;
case BAL: a->balan=a->izq->balan=BAL;
break;
case DER: a->balan=BAL;
a->izq->balan=IZQ;
break;
}
a->izq->der->balan=BAL;
a=roteIzqDer( a );
}
return a;
}
AVL insertar( AVL a, AVL p, int *masAlto )
{ if( a==NULL )
{ *masAlto=TRUE;
a=p;
}
else if( a->info>p->info )
{ a->izq=insertar( a->izq,p,masAlto );
if( *masAlto )
switch( a->balan )
{ case IZQ: *masAlto=FALSE;
a=balanceaIzq(a);
break;
case BAL: a->balan=IZQ;
break;
case DER: *masAlto=FALSE;
a->balan=BAL;
break;
}
}
else
{ a->der=insertar(a->der,p,masAlto);
if( *masAlto )
switch( a->balan )
{ case IZQ: *masAlto=FALSE;
a->balan=BAL;
break;
case BAL: a->balan=DER;
break;
case DER: *masAlto=FALSE;
a=balanceaDer( a );
}
}
return a;
}
AVL insAVL( AVL a, TipoAVL elem )
{ AVL p=( AVL )malloc( sizeof( TAVL ) );
int masAlto;
p->izq=p->der = NULL;
p->info = elem;
p->balan = BAL;
return insertar( a, p, &masAlto );
}
AVL balanIzq( AVL a, int *menosAlto )
{ switch( a->balan )
{ case IZQ: if( a->izq->balan!=DER )
{ a=roteDer( a );
if( a->balan==BAL )
{ a->balan=DER;
a->der->balan=IZQ;
*menosAlto=FALSE;
}
else
a->balan=a->der->balan=BAL;
}
else
{ a=roteIzqDer( a );
a->der->balan=( a->balan==IZQ )?DER:BAL;
a->izq->balan=( a->balan==DER )?IZQ:BAL;
a->balan=BAL;
}
break;
case BAL: a->balan=IZQ;
*menosAlto=FALSE;
break;
case DER: a->balan=BAL;
break;
}
return a;
}
AVL balanDer( AVL a, int *menosAlto )
{ switch( a->balan )
{ case IZQ: a->balan=BAL;
break;
case BAL: a->balan=DER;
*menosAlto=FALSE;
break;
case DER: if( a->der->balan!=IZQ )
{ a=roteIzq( a );
if( a->balan==BAL )
{ a->balan=IZQ;
a->izq->balan=DER;
*menosAlto=FALSE;
}
else
a->balan=a->izq->balan=BAL;
}
else
{ a=roteDerIzq( a );
a->izq->balan=( a->balan==DER )?IZQ:BAL;
a->der->balan=( a->balan==IZQ )?DER:BAL;
a->balan=BAL;
}
break;
}
return a;
}
TipoAVL mayorElemento( AVL a )
{ if( a->der==NULL )
return a->info;
else
return mayorElemento( a->der );
}
AVL eliminar( AVL a, TipoAVL elem, int *menosAlto )
{ AVL p;
int mayor;
if( a->info == elem )
{ if( a->izq == NULL && a->der == NULL )
{ free( a );
*menosAlto = TRUE;
return NULL;
}
else if( a->izq == NULL )
{ p = a->der;
free( a );
*menosAlto = TRUE;
return p;
}
else
{ mayor = mayorElemento( a->izq );
a->info = mayor;
a->izq = eliminar( a->izq, mayor, menosAlto );
if( *menosAlto )
a = balanDer( a, menosAlto );
}
}
else if( a->info > elem )
{ a->izq = eliminar( a->izq, elem, menosAlto );
if( *menosAlto )
a = balanDer( a, menosAlto );
}
else
{ a->der = eliminar( a->der, elem, menosAlto );
if( *menosAlto )
a=balanIzq( a, menosAlto );
}
return a;
}
AVL elimAVL( AVL a, TipoAVL elem )
{ int menosAlto;
return eliminar( a, elem, &menosAlto );
}
int estaAVL( AVL a, TipoAVL elem )
{ if( a == NULL )
return FALSE;
else if( a->info == elem )
return TRUE;
else if( a->info > elem )
return estaAVL( a->izq, elem );
else
return estaAVL( a->der, elem );
}
void impBlancos( int n )
{ for( n = ( n < 2 ) ? 2 : n; n>0; n-- )
cout<< " " ;
}
void niveles( AVL a )
{ Lista lst = inicLista( );
Cola col;
int numElem=1, i=0, nivelVacio=TRUE;
if ( a!=NULL )
{ adicCola( col=inicCola( ),a );
while( !vaciaCola( col ) )
{ a=infoCola( col );
elimCola( col );
if ( a!=NULL )
{ nivelVacio=FALSE;
anxLista( lst,a->info );
adicCola( col,a->izq );
adicCola( col,a->der );
}
else
{ anxLista( lst, MARCA );
adicCola( col, NULL );
adicCola( col, NULL );
}
if( ++i==numElem )
{ if( nivelVacio )
{ destruirCola( col );
destruirLista( lst );
return;
}
for(primLista(lst);!finLista(lst);sigLista(lst))
{ impBlancos((64-(numElem*2))/(numElem+1));
if( infoLista( lst ) == MARCA ) cout<<"* ";
else cout<<infoLista( lst ) ;
}
cout<<"\n";
destruirLista( lst );
lst=inicLista( );
nivelVacio=TRUE;
numElem*=2;
i=0;
}
}
}
}
void inorden( AVL a )
{ if( a!=NULL )
{ inorden( a->izq );
cout<<a->info ;
inorden( a->der );
}
}
int altoAVL( AVL a )
{ if( a==NULL )
return 0;
else if( a->izq==NULL && a->der==NULL )
return 1;
else
{ int alt1 = altoAVL( a->izq );
int alt2 = altoAVL( a->der );
return ( ( alt1 > alt2 ) ? alt1 : alt2 ) + 1;
}
}
int esAVL( AVL a )
{ int alt1,alt2,dif;
if( a==NULL || ( a->izq==NULL && a->der==NULL ) )
return 1;
else
{ alt1=altoAVL( a->izq );
alt2=altoAVL( a->der );
dif=alt1-alt2;
if( dif!=a->balan )
cout<< "Factor de balance errado\n" ;
if( dif<-1 || dif>1 )
cout<< "Arbol mal balanceado\n";
return esAVL( a->izq ) && esAVL( a->der );
}
}
void main()
{
AVL a1;
Lista lst;
int num, i, longi;
int elem = -1;
char resp;
a1=inicAVL( );
textcolor(WHITE);
textbackground(BLUE);
clrscr();
while( elem!=0 )
{
gotoxy(30,6);cout << "MENU PRINCIPAL";
gotoxy(22,8);cout<<"1. Insertar\n" ;
gotoxy(22,9);cout<< "2. Eliminar\n" ;
gotoxy(22,10);cout<< "3. Buscar\n" ;
gotoxy(22,11);cout<< "4. Probar operaciones automaticamente\n" ;
gotoxy(22,12);cout<< "5. Salir\n" ;
gotoxy(22,13);cout<<"Opcion : [ ]";
gotoxy(32,13);cin>>elem;
clrscr();
switch(elem)
{
do{
case 1: // Insertar
cout<<"Elemento: " ;
cin>>elem ;
a1=insAVL( a1,elem );
cout<<"desea ingresar mas elementos s/n"<<endl;
cin>>resp;
}while (resp=='s'||resp=='S');
break;
getch();
case 2: // Eliminar
cout<<"Elemento: " ;
cin>>elem ;
a1=elimAVL( a1,elem );
break;
case 3: // Buscar
cout<<"Elemento: " ;
cin>>elem ;
if( estaAVL( a1,elem ) )
cout<< "Elemento " <<elem<<" SI esta presente\n" ;
else
cout<<"Elemento "<<elem<<" NO esta presente\n";
break;
case 4: // Probar automaticamente las operaciones
cout<< "> Numero de elementos: " ;
cin>>num ;
// Inserta num valores aleatorios en el rango 1..num*5
a1=inicAVL( );
lst = inicLista( );
cout<<"Insertando" ;
for( i = 1; i <= num; i++ )
{ elem = random( num*5 )+1;
if( !estaAVL( a1,elem ) )
{ insLista( lst,elem );
a1=insAVL( a1,elem );
}
cout<< "." ;
if( !estaAVL( a1,elem ) )
cout<< "ERROR en operacion de insercion\n" ;
if( !esAVL( a1 ) )
cout<<"ERROR estructural en arbol 2-3\n" ;
}
// Imprime el orden del arbol
cout<<"\n" ;
inorden( a1 );
cout<< "\n" ;
// Imprime el arbol por niveles
niveles( a1 );
// Elimina aleatoriamente cada elemento insertado
cout<< "Eliminando" ;
longi=longLista( lst );
for( ; longi > 0; )
{ posLista( lst, i = random( longi )+1 );
elem = infoLista( lst );
a1=elimAVL( a1,elem );
elimLista( lst );
cout<< "." ;
if( estaAVL( a1,elem ) )
cout<<"ERROR en operacion de supresion\n" ;
if( !esAVL( a1 ) )
cout<< "ERROR estructural en arbol 2-3\n" ;
longi=longLista( lst );
}
break;
case 5:exit(0);
}
// Imprime el inorden del arbol
inorden( a1 );
cout<< "\n" ;
// Imprime el arbol por niveles
niveles( a1 );
cout<<"\n" ;
getch();
clrscr();
// Verifica que haya quedado bien construido el arbol
if( !esAVL( a1 ) )
return;
}
}

Inicio | Biografía | Cursos | Para pensar... | Para reflexionar... | Para reir | Enlaces
| Profesor
Gustavo Martínez Villalobos Email: gustavo.martinez@unibague.edu.co Facultad de Ingeniería de Sistemas, Coruniversitaria Ibagué, Tolima, COLOMBIA |
|