ARBOLES AVL

  Un árbol AVL es un árbol binario de búsqueda (ABB) que tiene como característica que siempre esta balanceado; que se le añade una condición de equilibrio. esta condición es que para todo nodo ,la altura de sus subárboles izquierdo y derecho pueden diferir a lo sumo en 1.

CARACTERISTICAS

La diferencia entre las alturas de los subárboles derecho e izquierdo no debe excederse en más de 1. 
Cada nodo tiene asignado un peso de acuerdo a las alturas de sus subárboles. 
Un nodo tiene un peso de 1 si su subárbol derecho es más alto, -1 si su subárbol izquierdo es más alto y 0 si las alturas son las mismas. 
La inserción y eliminación en AVLS es la misma que en los ABBS. 

EQUILIBRIO
Equilibrio (n) = altura-der (n) – altura-izq (n) describe relatividad entre subárbol der y subárbol izq. El factor de equilibrio es la diferencia entre las alturas del árbol derecho y el izquierdo:
FE = altura subárbol derecho - altura subárbol izquierdo;
por definición, para un árbol AVL, este valor debe ser -1, 0 ó 1.
si el factor de equilibrio de un nodo es:
0 -> el nodo está equilibrado y sus subárboles tienen exactamente la misma altura.
1 -> el nodo está equilibrado y su subárbol derecho es un nivel más alto.
-1 -> el nodo está equilibrado y su subárbol izquierdo es un nivel más alto.
si el factor de equilibrio                  es necesario reequilibrar.

El reequilibrado se produce de abajo hacia arriba sobre los nodos en los que se produce el desequilibrio. pueden darse dos casos: rotación simple o rotación doble; a su vez ambos casos pueden ser hacia la derecha o hacia la izquierda.

     Se encuentra rotación simple cuando se cambia de nodos de izquierda a derecha o derecha a izquierda


Se realiza rotacion doble cuando hay las dos formas de rotacion simultanias


0 comentarios:

GRAFOS EN C

Los grafos no son más que la versión general de un árbol, es decir, cualquier nodo de un grafo puede apuntar a cualquier otro nodo de éste (incluso a él mismo). Este tipo de estructuras de datos tienen una característica que lo diferencia de las estructuras que hemos visto hasta ahora: los grafos se usan para almacenar datos que están relacionados de alguna manera (relaciones de parentesco, puestos de trabajo, ...); por esta razón se puede decir que los grafos representan la estructura real de un problema. En lo que a ingeniería de telecomunicaciones se refiere, los grafos son una importante herramienta de trabajo, pues se utilizan tanto para diseño de circuitos como para calcular la mejor ruta de comunicación en Internet.

Terminología de grafos: 

 Vértice : Nodo.
Enlace : Conexión entre dos vértices (nodos).
Adyacencia : Se dice que dos vértices son adyacentes si entre ellos hay un enlace directo.
Vecindad : Conjunto de vértices adyacentes a otro.
 Camino : Conjunto de vértices que hay que recorrer para llegar desde un nodo origen hasta un nodo destino.
Grafo conectado : Aquél que tiene camino directo entre todos los nodos.
 Grafo dirigido : Aquél cuyos enlaces son unidireccionales e indican hacia donde están dirigidos.
Gafo con pesos : Aquél cuyos enlaces tienen asociado un valor. En general en este tipo de grafos no suele tener sentido que un nodo se apunte a sí mismo porque el coste de este enlace sería nulo.

Representación en memoria de un grafo: 

Una característica especial en los grafos es que podemos representarlos utilizando dos estructuras de datos distintas. En los algoritmos que se aplican sobre ellos veremos que adoptarán tiempos distintos dependiendo de la forma de representación elegida. En particular, los tiempos de ejecución variarán en función del número de vértices y el de aristas, por lo que la utilización de una representación u otra dependerá en gran medida de si el grafo es denso o disperso.
Para nombrar los nodos utilizaremos letras mayúsculas, aunque en el código deberemos hacer corresponder cada nodo con un entero entre 1 y V (número de vértices) de cara a la manipulación de los mismos.

Representación por matriz de adyacencia
Es la forma más común de representación y la más directa. Consiste en una tabla de tamaño V x V, en que la que a[i][j] tendrá como valor 1 si existe una arista del nodo i al nodo j. En caso contrario, el valor será 0. Cuando se trata de grafos ponderados en lugar de 1 el valor que tomará será el peso de la arista. Si el grafo es no dirigido hay que asegurarse de que se marca con un 1 (o con el peso) tanto la entrada a[i][j] como la entrada a[j][i], puesto que se puede recorrer en ambos sentidos.
int V,A;
int a[maxV][maxV];
{
void inicializar()
char v1,v2;
int i,x,y,p; // Leer V y A
for (i=1; i<=A; i++)
memset(a,0,sizeof(a)); {
x=v1-'A'; y=v2-'A';
scanf("%c %c %d\n",&v1,&v2,&p); a[x][y]=p; a[y][x]=p;
}
}

Representación por lista de adyacencia
Otra forma de representar un grafo es por medio de listas que definen las aristas que conectan los nodos. Lo que se hace es definir una lista enlazada para cada nodo, que contendrá los nodos a los cuales es posible acceder. Es decir, un nodo A tendrá una lista enlazada asociada en la que aparecerá un elemento con una referencia al nodo B si A y B tienen una arista que los une. Obviamente, si el grafo es no dirigido, en la lista enlazada de B aparecerá la correspondiente referencia al nodo A.
Las listas de adyacencia serán estructuras que contendrán un valor entero (el número que identifica al nodo destino), así como otro entero que indica el coste en el caso de que el grafo sea ponderado. En el ejemplo se ha utilizado un nodo z ficticio en la cola (ver listas, apartado cabeceras y centinelas).
struct nodo
{ int v;
nodo *sig;
int p; };
int V,A; // vértices y aristas del grafo
struct nodo *a[maxV], *z; void inicializar() {
z=(struct nodo *)malloc(sizeof(struct nodo));
int i,x,y,peso; char v1,v2; struct nodo *t; z->sig=z;
scanf("%c %c %d\n",&v1,&v2,&peso);
for (i=0; i<V; i++) a[i]=z; for (i=0; i<A; i++) { x=v1-'A'; y=v2-'A';
t->v=y; t->p=peso; t->sig=a[x]; a[x]=t;
t=(struct nodo *)malloc(sizeof(struct nodo));
t->v=x; t->p=peso; t->sig=a[y]; a[y]=t;
t=(struct nodo *)malloc(sizeof(struct nodo)); }
}
En este caso el espacio ocupado es O(V + A), muy distinto del necesario en la matriz de adyacencia, que era de O(V2). La representación por listas de adyacencia, por tanto, será más adecuada para grafos dispersos.

Exploración de grafos
A la hora de explorar un grafo, nos encontramos con dos métodos distintos. Ambos conducen al mismo destino (la exploración de todos los vértices o hasta que se encuentra uno determinado), si bien el orden en que éstos son "visitados" decide radicalmente el tiempo de ejecución de un algoritmo, como se verá posteriormente.
En primer lugar, una forma sencilla de recorrer los vértices es mediante una función recursiva, lo que se denomina búsqueda en profundidad. La sustitución de la recursión (cuya base es la estructura de datos pila) por una cola nos proporciona el segundo método de búsqueda o recorrido, la búsqueda en amplitud o anchura.





















Suponiendo que el orden en que están almacenados los nodos en la estructura de datos correspondiente es A-B-C-D-E-F... (el orden alfabético), tenemos que el orden que seguiría el recorrido en profundidad sería el siguiente:
A-B-E-I-F-C-G-J-K-H-D
En un recorrido en anchura el orden sería, por contra:
A-B-C-D-E-G-H-I-J-K-F
Es decir, en el primer caso se exploran primero los verdes y luego los marrones, pasando primero por los de mayor intensidad de color. En el segundo caso se exploran primero los verdes, después los rojos, los naranjas y, por último, el rosa.
Es destacable que el nodo D es el último en explorarse en la búsqueda en profundidad pese a ser adyacente al nodo de origen (el A). Esto es debido a que primero se explora la rama del nodo C, que también conduce al nodo D.
En estos ejemplos hay que tener en cuenta que es fundamental el orden en que los nodos están almacenados en las estructuras de datos. Si, por ejemplo, el nodo D estuviera antes que el C, en la búsqueda en profundidad se tomaría primero la rama del D (con lo que el último en visitarse sería el C), y en la búsqueda en anchura se exploraría antes el H que el G.






















3 comentarios:

ARBOLES BINARIOS

Un árbol binario es una estructura de datos en la cual cada nodo puede tener un hijo izquierdo y un hijo derecho. No pueden tener más de dos hijos (de ahí el nombre "binario"). Si algún hijo tiene como referencia a null, es decir que no almacena ningún dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno.Los arboles como máximo pueden tener dos nodos hijo.
15 NODO RAIZ
1,4,7,12,17,24 NODOS HOJA
5,2,9,18,20 NODOS RAMAS


Definicion de un arbol binario como estructura

#include <stdio.h>
#include <conio.h>

struct nodo {
   int info;
   struct nodo *izq;
   struct nodo *der;
};
//DEFINIMOS ESTRUCTURA
typedef struct nodo arbol;
void ins_izq(arbol *,char);  //NODO IZQUIERDO
void ins_der(arbol *,char); //NODO DERECHO
//DIFERENTES RECORRIDOS EXPLICADOS MAS ABAJO
void inOrden( arbol*);
void preOrden( arbol*);
void postOrden( arbol*);
void imp_arbol( arbol *,int, int);

void main () {
   struct nodo *raiz,*q;
   int x,y;
//ASIGNACION DE VALOR EN NODO RAIZ
   raiz=new arbol;
   raiz->info=30;
   raiz->izq=NULL;
   raiz->der=NULL;
//ASIGNACION DE VALORES A NODO IZQUIERDO DERECHO Y HIJOS
   ins_izq(raiz,25 );
   ins_der(raiz, 42);
   q=raiz->izq;
   ins_izq(q, 21);
   ins_der(q, 29);
   q=raiz->izq->izq;
   ins_izq(q, 19);
   ins_der(q, 22);
   q=raiz->izq->izq->izq;
   ins_izq(q, 18);
   q=raiz->izq->izq->izq->izq;
   ins_izq(q, 16);
   q=raiz->izq->izq->izq->izq->izq;
   ins_izq(q, 15);
   q=raiz->izq->izq->izq->izq->izq->izq;
   ins_izq(q, 5);
   q=raiz->izq->izq->izq->izq->izq->izq->izq;
   ins_der(q, 8);
   
   q=raiz->der;
   ins_izq(q, 32);
   ins_der(q, 60);
   q=raiz->der->izq;
   ins_izq(q, 31);
   ins_der(q, 40);
   q=raiz->der->izq->der;
   ins_izq(q, 33);
   q=raiz->der->der;
   ins_izq(q, 43);
   q=raiz->der->der->izq;
   ins_der(q, 51);
   q=raiz->der->der->izq->der;
   ins_der(q, 56);
   q=raiz->der->der->izq->der->der;
   ins_izq(q, 52);
   
preOrden (raiz);
printf("\n\n");
inOrden(raiz);
printf("\n\n");
postOrden(raiz);
getchar();
//clrscr();
   x=40;
   y=15; 
x y Y UBICACION EN PANTALLA DE ARBOL
   imp_arbol( raiz, x, y);
   getchar();
} //fin main
//insertar izquierda

void ins_izq(struct nodo *p,char n){  //PROCEDIMIENTO DE INSERTADO 
   arbol *nuevo;
   nuevo=new arbol;
   nuevo->info=n;
   nuevo->izq=NULL;
   nuevo->der=NULL;
   p->izq=nuevo;
}

//insertar derecha PREORDEN  HOJAS NIVEL POSORDEN

void ins_der(struct nodo *p,char n){
   arbol *nuevo;
   nuevo=new arbol;
   nuevo->info=n;
   nuevo->izq=NULL;
   nuevo->der=NULL;
   p->der=nuevo;
}
////////////////////////////////////////////////////////////////////////////

void imp_arbol( arbol *ptrArbol,int x,int y ){ IMPRECION DE ARBOL EN EJES X Y
   if ( ptrArbol!=NULL){
      gotoxy(x,y);
          
      printf("%d",ptrArbol->info);
     
   
      
      x=x-3;
      y=y+3;
      imp_arbol( ptrArbol->izq,x,y);
      x=x+6;
      imp_arbol( ptrArbol->der,x,y);
      y=y-3;
   }

}

RECORRIDO DE ARBOLES BINARIOS

INORDEN(izquierdo, raíz, derecho).
Para recorrer un árbol binario no vacío en inorden (simétrico), hay que realizar las siguientes operaciones recursivamente en cada nodo:
  1. Atraviese el sub-árbol izquierdo
  2. Visite la raíz
  3. Atraviese el sub-árbol derecho

void inOrden (arbol *ptrArbol){
    printf("");
    if (ptrArbol != NULL){
     inOrden (ptrArbol->izq);
     printf("%d ",ptrArbol->info);
     inOrden(ptrArbol->der);
     }
}

PREORDEN (raíz, izquierdo, derecho).
 Para recorrer un árbol binario no vacío en preorden, hay que realizar las siguientes operaciones recursivamente en cada nodo, comenzando con el nodo de raíz:
  1. Visite la raíz
  2. Atraviese el sub-árbol izquierdo
  3. Atraviese el sub-árbol derecho
void preOrden (arbol *ptrArbol){
    printf("");
    if (ptrArbol != NULL){
     printf("%d ",ptrArbol->info);
     preOrden (ptrArbol->izq);
     preOrden(ptrArbol->der);
     }
}

POS ORDEN (izquierdo, derecho, raíz).
Para recorrer un árbol binario no vacío en postorden, hay que realizar las siguientes operaciones en cada nodo:
  1. Atraviese el sub-árbol izquierdo
  2. Atraviese el sub-árbol derecho
  3. Visite la raíz
void postOrden (arbol *ptrArbol){
   if (ptrArbol != NULL){
    preOrden (ptrArbol->izq);
    preOrden(ptrArbol->der);
    printf("%d ",ptrArbol->info);
    }
   }


0 comentarios:

ARBOLES B+

Los árboles-B+ se han convertido en la técnica mas utilizada para la organización de archivos indizados. La principal característica de estos arboles es que todas las claves se encuentran en las hojas y por lo tanto cualquier camino desde la raíz hasta alguna de las claves tienen la misma longitud. En la figura 8.4 representamos un diagrama de un arbol-B+ de orden 2.

Es de notar que los arboles-B+ ocupan un poco mas de espacio que los arboles-B, y esto ocurre al existir duplicidad en algunas claves. Sin embargo, esto es aceptable si el archivo se modifica frecuentemente, puesto que se evita la operación de reorganización del árbol que es tan costosa en los arboles-B.
Formalmente se define un árbol-B+ de la siguiente manera:
  1. Cada pagina, excepto la raíz, contiene entre d y 2d elementos.
  2. Cada pagina, excepto la raíz, tiene entre d + 1 y 2d + 1 descendientes. Se utiliza m para expresar el numero de elementos por pagina.
  3. La pagina raíz tiene al menos dos descendientes.
  4. Las paginas hojas están todas al mismo nivel.
  5. Todas las claves se encuentran en las paginas hojas.
  6. Las claves de las paginas raíz e interiores se utilizan como índices.
  7. Búsqueda De Arboles-B+
La operación de búsqueda en árboles-B+ es similar a la operación de búsqueda en árboles-B. El proceso es simple, sin embargo puede suceder que al buscar una determinada clave la misma se encuentra en una pagina raíz o interior, en dicho caso no debe detenerse el proceso, sino que debe continuarse la búsqueda con la pagina apuntada por la rama derecha de dicha clave. Por ejemplo, al buscar la clave 55 en el árbol-B+ de la figura 8.4 se advierte que esta se encuentra en la pagina raíz. En este caso, debe continuarse el proceso de búsqueda en la pagina apuntada por la rama derecha de dicha clave.

Inserción en árboles B+
El proceso de inserción en árboles-B+ es relativamente simple, similar al proceso de inserción en árboles-B. La dificultad se presenta cuando desea insertarse una clave en una pagina que se encuentra llena ( m = 2d ). En este caso, la pagina afectada se divide en 2, distribuyéndose las m + 1 claves de la siguiente forma: " las d primeras claves en la pagina de la izquierda y las d + 1 restantes claves en la pagina derecha ". Una copia de la clave del medio sube a la pagina antecesora. En la figura 8.5 hay dos diagramas que ilustran como funciona este caso.



a) Antes de insertar la clave.b)Después de insertarla.
Puede suceder que la pagina antecesora se desborde nuevamente, entonces tendrá que repetirse el proceso anterior. Es importante notar que el desbordamiento en una pagina que no es hoja no produce duplicidad de claves. El proceso de propagación puede llegar hasta la raíz, en cuyo caso la altura del árbol puede incrementarse en una unidad. En la figura 8.6 se presentan dos diagramas que clarifican y resuelven este caso.



Borrado En Arboles-B+
La operación de borrado en árboles-B+ es mas simple que la operación de borrado en árboles-B. Esto ocurre porque las claves a eliminar siempre se encuentran en las paginas hojas. En general deben distinguirse los siguientes casos:
1. Si al eliminar una clave, m queda mayor o igual a d entonces termina la operación de borrado. Las claves de las paginas raíz o internas no se modifican por mas que sean una copia de la clave eliminada en las hojas. 

2. Si al eliminar una clave, m queda menor a d entonces debe realizarse una redistribución de claves, tanto en el índice como en las paginas hojas. ( Hay dos ejemplos que ilustran como funciona este caso en la figura 8.10 ).
Figura 8.10 Eliminación de la clave 27


EJEMPLO:

#include <iostream.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <conio.h> 
#include <windows.h> 

struct Nodo 
    int Cod; 
    char nombre[40]; 
    Nodo *HI; 
    Nodo *HD; 
}; 


Nodo* crearNodo(int id, char* n); 
Nodo* buscar (Nodo* p, int matricula); 
void insertar (Nodo** raiz, int matricula, char* nombre); 
void reemplazar(Nodo** act); 
void eliminar (Nodo** raiz, int matricula); 
void visualizar (Nodo* r, int x, int y); 
int profundidad (Nodo *raiz); 
void gotoxy(int x,int y);

int x=10, y=5;

Nodo* crearNodo(int id, char *n) 
        Nodo *t; 
        t = (Nodo*)malloc(sizeof(Nodo)); 
        t->Cod=id; 
        strcpy(t->nombre, n); 
        t->HI=NULL; 
        t->HD=NULL; 
        return(t); 

//Busca un nodo dado: ITERATIVO 
Nodo* buscar (Nodo* raiz, int matricula) 
      int encontrado = 0;

      while (!encontrado && raiz != NULL) 
      { 
            if (matricula == raiz->Cod) 
               encontrado = 1; 
            else if (matricula < raiz->Cod) 
                 raiz = raiz->HI; 
            else if (matricula > raiz->Cod) 
                 raiz = raiz->HD; 
      } 
      return raiz; 

//Inserta un nodo con matricula en el lugar que le corresponde 
void insertar (Nodo** raiz, int matricula, char *nombre) 
   if (!(*raiz)) 
      *raiz = crearNodo(matricula, nombre); 
   else 
   if (matricula < (*raiz)->Cod) 
      insertar (&((*raiz)->HI),matricula, nombre); 
      else 
           insertar (&((*raiz)->HD),matricula, nombre); 
/** 
* Elimina un nodo dado 
* Presenta dos casos: 
* 1. El NODO a eliminar es una HOJA o tiene un UNICO descendientelo que hay que 
* hacer es asignar el enlace del NODO PADRE el descendiente del nodo a eliminar 
* 2. El NODO tiene las dos subarboles NO VACIOS, para mantener la estructura 
* de un ABB, se tienen dos alternativas: 
* - Reemplazar el NODO por la menor de las claves mayores en su Subarbol derecho 
* - Reemplazar el NODO por la mayor de las claves menores en su Subarbol izquierdo 
* Se elige la SEGUNDA alternativa.Como las claves menores estan en la rama 
* iquierda, se elige la clave de mas a la derecha (hoja) que es el MAYOR de 
* los menores y que reemplaza el NODO a eliminar. La Funcion reemplazar() 
* realiza esa tarea. 
*/ 
void eliminar (Nodo** r, int matricula) 
     if (!(*r)) 
        printf("!! Nodo no encontrado !!\n\n"); 
     else 
          if (matricula < (*r)->Cod) 
              eliminar(&(*r)->HI, matricula); 
          else 
             if (matricula> (*r)->Cod) 
                 eliminar(&(*r)->HD,matricula); 
             else // Nodo encontrado 
             { 
                   Nodo* q; // puntero al nodo a suprimir 
                   q = (*r); 
                   if (q -> HI == NULL) 
                      (*r) = q -> HD; 
                   else 
                        if (q -> HD == NULL) 
                           (*r) = q -> HI; 
                        else 
                        { // tiene rama izquierda y derecha 
                             reemplazar(&q); 
                        } 
                        free(q); 
                        printf("%d eliminado ...!!\n\n", matricula); 
             } 
//

void reemplazar(Nodo** act) 
     Nodo* a, *p; 

     p = *act; 
     a = (*act)->HI;// rama de menores 
     while (a->HD) 
     { 
           p = a; 
           a = a -> HD; 
     } 
     (*act)->Cod=a->Cod; 
     strcpy((*act)->nombre,a->nombre); 
     if (p == (*act)) 
        p->HI = a -> HI; 
     else 
        p->HD = a -> HI; 
        (*act) = a; 

//Visualiza utilizando recorrido inorden 
void visualizar (Nodo* r, int x, int y) 
     if (r) 
     { 
       
        
        gotoxy(x,y);
        printf("k:%d, d:%s\n",r->Cod,r->nombre); 
        x=x-5;
        y=y+5;
        visualizar(r -> HI,x,y); 
        x=x+10;
        visualizar(r -> HD,x,y); 
        y=y-5;         
     } 

//Elimina cada uno de los nodos del arbol 
void eliminarbol(Nodo *r) 
     if (r != NULL) 
     { 
        eliminarbol(r -> HI); 
        eliminarbol(r -> HD); 
        printf("\tNodo borrado "); 
        free(r); 
     } 
//Determina la mayor profundidad entre sub arbol izquierdo y derecho 
int profundidad (Nodo *raiz) 
    if (!raiz) 
       return 0; 
    else 
    { 
         int profundidadI = profundidad (raiz->HI); 
         int profundidadD = profundidad (raiz->HD); 
         if (profundidadI > profundidadD) 
            return profundidadI + 1; 
         else 
            return profundidadD + 1; 
    } 

void gotoxy(int x,int y)
{  
      HANDLE hcon;  
      hcon = GetStdHandle(STD_OUTPUT_HANDLE);  
      COORD dwPos;  
      dwPos.X = x;  
      dwPos.Y= y;  
      SetConsoleCursorPosition(hcon,dwPos);  

int main() 
    int nm, i=1; 
    char nom[30]; 
    Nodo *Q, *raiz = NULL; 
    do{ 
            system("cls"); 
            printf("\t\tARBOL BINARIO DE BUSQUEDA\n\n"); 
            printf("\t1. Ingresar Registros\n"); 
            printf("\t2. Mostrar el árbol\n"); 
            printf("\t3. Buscar dato\n"); 
            printf("\t4. Eliminar un registro\n"); 
            printf("\t5. Altura del Arbol\n"); 
            printf("\t6. Salir\n "); 
            do{ 
                printf("\n\tDigite su opcion ---> "); 
                scanf("%d%*c", &nm); 
            }while(nm<1 || nm>6); 
            { 
                        if (nm == 1) 
                        { 
                           // Crea el árbol 
                           do{ 
                                system("cls"); 
                                printf("\t\tRUTINA DE INGRESO DE DATOS \n\n"); 
                                printf("\tRegistro %d\n", i); 
                                printf("Codigo(0:Fin)---> "); 
                                scanf("%d%*c",&nm); 
                                if (nm) 
                                { 
                                   printf("Nombre ---------> "); 
                                   gets(nom); 
                                   insertar(&raiz,nm,nom); 
                                } 
                                i=i+1; 
                           }while (nm); 
                        } 
                        if (nm == 2) 
                        { 
                            system("cls"); 
                            printf("\n\t RELACION DE ALUMNOS\n\n"); 
                            visualizar(raiz,x,y);
                            printf("\n\n\n"); 
                            system("pause"); 
                        } 
                        if (nm == 3) 
                        { 
                           int cl; 
                           system("cls"); 
                           printf("\n\t BUSCAR DATO\n\n"); 
                           printf("Codigo ---> "); 
                           scanf("%d",&cl); 
                           Q=buscar(raiz,cl); 
                           if(Q!=NULL) 
                           { 
                               printf("\nDato encontrato: %d %s\n\n",Q->Cod, Q->nombre); 
                           } 
                           else 
                           { 
                                printf("\n%d DATO NO encontrato...\n\n",cl); 
                           } 
                           system("pause"); 
                        } 
                        if (nm == 4) 
                        { 
                           int cl; 
                           system("cls"); 
                           printf("\n\t RUNTINA DE ELIMINACION\n\n"); 
                           printf("Codigo ---> "); 
                           scanf("%d",&cl); 
                           eliminar(&raiz,cl); 
                           system("pause"); 
                        } 
                        else 
                             if(nm == 5) 
                             { 
                                   system("cls"); 
                                   int Altura; 
                                   printf("\n\t RUNTINA DE CALCULO DEL ARBOL\n\n"); 
                                   Altura=profundidad(raiz); 
                                   printf("\nAltura del arbol ---> %d\n", Altura-1); 
                                   system("pause"); 
                             } 
            } 
    }while (nm != 6); 

    system("PAUSE"); 
    return (0); 


























1 comentarios:

Copyright © 2013 Lenguaje c and Blogger Themes.