Ancosen
12-04-2005, 15:42
Con questa consegna:
Si definisca una funzione C che restituisce 1 se l'albero in input è completo, 0 altrimenti. Un albero binario è completo se ogni nodo ha 0 o 2 figli e tutte le foglie sono al piu’ su due livelli successivi, con quelle sul livello massimo tutte a sinistra. In altre parole un albero binario e’ completo se per ogni nodo i suoi sottoalberi sinistro e destro hanno la stessa altezza, il sinistro e’ pieno e il destro completo oppure il sottoalbero di sinistra, completo, e’ di 1 piu’ alto di quello di destra, che deve essere pieno. La funzione ha il seguente prototipo: int completo(treePtr tPtr)
Io avevo pensato a questo visto che credo un po' tutto dipenda dall'altezza dell'albero in questione.
#include<stdio.h>
#include<stdlib.h>
struct treenode
{
struct treenode *lPtr;
int data;
struct treenode *rPtr;
};
typedef struct treenode TreeNode;
typedef TreeNode *treePtr;
int completo(treePtr tPtr);
int alt(treePtr tPtr);
int max (int x, int y);
int alt(TreePtr tPtr) {
if (!tPtr ) return -1;
return max(alt(tPtr->lPtr),alt(tPtr->rPtr)) +1;
}
int max (int x, int y) {
if (x<y) return y;
else return x;
}
int completo(treePtr tPtr)
{
if (alt(tPtr->lPtr) == alt(tPtr->rPtr))
return 1;
return 0;
}
La mia domanda è se la funzione implementata può essere migliorata e se manca qualcosa d'importante. Grazie mille!
Si definisca una funzione C che restituisce 1 se l'albero in input è completo, 0 altrimenti. Un albero binario è completo se ogni nodo ha 0 o 2 figli e tutte le foglie sono al piu’ su due livelli successivi, con quelle sul livello massimo tutte a sinistra. In altre parole un albero binario e’ completo se per ogni nodo i suoi sottoalberi sinistro e destro hanno la stessa altezza, il sinistro e’ pieno e il destro completo oppure il sottoalbero di sinistra, completo, e’ di 1 piu’ alto di quello di destra, che deve essere pieno. La funzione ha il seguente prototipo: int completo(treePtr tPtr)
Io avevo pensato a questo visto che credo un po' tutto dipenda dall'altezza dell'albero in questione.
#include<stdio.h>
#include<stdlib.h>
struct treenode
{
struct treenode *lPtr;
int data;
struct treenode *rPtr;
};
typedef struct treenode TreeNode;
typedef TreeNode *treePtr;
int completo(treePtr tPtr);
int alt(treePtr tPtr);
int max (int x, int y);
int alt(TreePtr tPtr) {
if (!tPtr ) return -1;
return max(alt(tPtr->lPtr),alt(tPtr->rPtr)) +1;
}
int max (int x, int y) {
if (x<y) return y;
else return x;
}
int completo(treePtr tPtr)
{
if (alt(tPtr->lPtr) == alt(tPtr->rPtr))
return 1;
return 0;
}
La mia domanda è se la funzione implementata può essere migliorata e se manca qualcosa d'importante. Grazie mille!