- #include<stdio.h> 
- #include<conio.h> 
- #include<stdlib.h> 
-   
- struct dato { 
-   int entero; 
- }; 
-   
- struct nodo { 
-   struct dato d; 
-   struct nodo *izq, *der; 
- }; 
-   
- int arbol_vacio(struct nodo *q); 
- struct nodo* arbol_lleno(); 
- struct nodo* insertar(struct nodo *q, struct dato x); 
- void listar_preorden(struct nodo *q); 
- float promedio(struct nodo *q, int*, int*); 
-   
- void main() { 
-   struct nodo *raiz = NULL; 
-   struct dato x; 
-   int c = 0, s = 0; 
-   
-   printf("Ingrese un entero:"); 
-   scanf("%d", &x.entero); 
-   
-   while(x.entero != 0) { 
-   
-     raiz = insertar(raiz, x); 
-   
-     printf("Ingrese un entero:"); 
-     scanf("%d", &x.entero); 
-   } 
-   
-   listar_preorden(raiz); 
-   
-   printf("\nEl promedio de los nodos hojas es:%.2f.", promedio(raiz,&c,&s)); 
-   
-   printf("\nPresione una tecla para salir"); 
-   getch(); 
- } 
-   
- int arbol_vacio(struct nodo *q) { 
-   
-   if(!q) { 
-     return 1; 
-   } else { 
-     return 0; 
-   } 
- } 
-   
-   
- struct nodo* arbol_lleno() { 
-   struct nodo *aux; 
-   
-   aux = (struct nodo*)malloc(sizeof(struct nodo)*1); 
-   
-   return aux; 
- } 
-   
-   
- void listar_preorden(struct nodo *q) { 
-   
-   if(q) { 
-     printf("\n%d", q->d.entero); 
-     listar_preorden(q->izq); 
-     listar_preorden(q->der); 
-   } 
- } 
-   
-   
- struct nodo* insertar(struct nodo *q, struct dato x) { 
-   struct nodo *nuevo, *ant = q, *act = q; 
-   
-   if((nuevo=arbol_lleno())==NULL) { 
-     printf("El arbol esta lleno"); 
-   } else { 
-     nuevo->d = x; 
-     nuevo->izq = nuevo->der = NULL; 
-   
-     if(arbol_vacio(q)) { 
-       q = nuevo; 
-     } else { 
-   
-       while(act!=NULL) { 
-         ant = act; 
-   
-         if(nuevo->d.entero > act->d.entero) { 
-           act = act->der; 
-         } else { 
-           act = act->izq; 
-         } 
-       } 
-   
-       if(nuevo->d.entero > ant->d.entero) { 
-         ant->der = nuevo; 
-       } else { 
-   
-         if(nuevo->d.entero < ant->d.entero) { 
-           ant->izq = nuevo; 
-         } else { 
-           printf("Clave duplicada"); 
-         } 
-       } 
-     } 
-   } 
-   return q; 
- } 
-   
-   
- float promedio(struct nodo *q, int *c, int *s) { 
-   
-   if(q) { 
-       if(q->izq==NULL && q->der==NULL) { 
-       (*c)++; 
-       (*s) += q->d.entero; 
-     } else { 
-       promedio(q->izq,&c,&s); 
-       promedio(q->der,&c,&s); 
-     } 
-   } 
-   return (float)(*s/(*c)); 
- } 
-