Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Función con árboles

Estas en el tema de Función con árboles en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 29/01/2008, 13:59
 
Fecha de Ingreso: marzo-2007
Mensajes: 13
Antigüedad: 17 años, 2 meses
Puntos: 0
Función con árboles

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.
  #2 (permalink)  
Antiguo 30/01/2008, 03:18
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 4 meses
Puntos: 606
Re: Función con árboles

La mejor manera para comprobarla es ejecutando un programa que lo use. Le pones chivatos al código, o que te vaya mostrando como esta ordenando el árbol, etc.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 21:48.