#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));
}