Saludos,
Tengo una duda con una función sobre árboles en C. Se me pidió que realizara el siguiente problema, y no sé si lo he hecho bien.
A continuación os copio el enunciado y mi solución:
Enunciado:
Diremos que un árbol n-ario está ordenado si para cualquier nodo n, el número de nodos de los subárboles que cuelgan de n aumenta de izquierda a derecha, esto es, si del nodo n cuelgan los subárboles T1, T2, ..., Tk, el número de nodos de Ti es menor o igual que el de Ti+1 (número total de nodos que cuelgan, no sólo hijos).
Dada la siguiente definición de una estrucutra en C:
typedef struct DefTNodo {
struct DefTNodo *pHijos; /* array de subárboles hijos */
int nhijos; /* número de hijos que tiene el árbol */
int elem; /* elemento que almacena el árbol */
} TNodo;
Crear una función que retorne si un árbol n-ario es ordenado. La función tendrá el siguiente prototipo:
int estaOrdenado (TNodo pRaiz); /*retornará 0 si no está ordenado. Otro valor si está ordenado*/
Un ejemplo de árbol ordenado sería el siguiente:
...........O
......../...|... \
......O...O....O
............|..../..\
...........O..O...O
..................../.|.\
..................O.O.O
Mi solución es la siguiente:
/* Esta función calcularía el número de nodos que tiene un determinado subárbol */
int numNodos (TNodo Raiz) {
int acumulador, i;
acumulador =0;
if (Raiz.pHijos==NULL) {
return (1);
}
else {
for (i=0; i<Raiz.nhijos; i++)
acumulador += numNodos (Raiz.pHijos[i]);
return (acumulador);
}
}
/* A continuación la función que te devuelve si el árbol está ordenado */
int estaOrdenado (TNodo pRaiz) {
int i, ordenado;
if (pRaiz.pHijos == NULL)
return (1); /*Si no tiene hijos, está ordenado, delvolvemos 1 */
for (i=0; i<pRaiz.nhijos-1; i++)
if (numNodos(pRaiz.pHijos[i])>numNodos(pRaiz.pHijos[i+1])
return (0); /* Vamos comparando para cada uno de los hijos del subárbol,
si su hermano de la derecha tiene menos nodos, en cuyo
caso delvovemos 0 (no está ordenado) */
/* Hemos comparado solo los hijos del subárbol, pero ahora hay que realizar la
comparación en cada uno de los subárboles */
for (i=0; i<pRaiz.nhijos; i++) {
ordenado=estaOrdenado (pRaiz.pHijos[i]);
if (!ordenado) return (0);
} /*Si alguno de los hijos del subárbol no está ordenado, ya podemos decir
que el subárbol está desordenado (devolvemos 0) */
return (1); /* Si TODOS los hijos del subárbol están ordenados, podemos decir
que el subárbol está ordenado */
}
Quería saber si la función estaría bien implementada.
Muchísimas gracias por adelantado por vuestras respuestas.
Un saludo.