// Funcionando int height(Node *n) { // Testa se o ponteiro é NULL... OBS: RETORNAR ERRO OU ZERO (ÁRVORE VAZIA)? if (n == NULL) { printf("ERRO! Ponteiro dado é NULL"); exit(-1); } int i; // contador int alt; // altura da subárvore corrente int alt_max = 0; // altura da maior (sub)árvore encontrada entre os filhos de n // Caso seja uma folha, retorna altura igual a 1 if (nb_of_children(n) == 0) { return 1; } // Senão calcula recursivamente else { // Calcula a altura da maior subárvore for (i = 0; i < nb_of_children(n); i++) { alt = height(child(n,i)); // Se altura calculada é maior que máxima já encontrada até agora, armazena o novo valor if (alt > alt_max) { alt_max = alt; // printf("Passou height()"); } } } // Retorna a altura da maior subárvore + 1 (nodo pai) return alt_max + 1; }
int main () { Node *pf1, *pf3, *pf0; Node **children; pf1 = create_leaf(1, int_node, "1", NULL); pf3 = create_leaf(1, int_node, "2", NULL); pack_nodes(&children, 0, pf1); pack_nodes(&children, 1, pf3); printf("h = %d\n", height(pf1)); /* deve imprimir 1 */ pf0 = create_node(1, int_node, "0", NULL, 2, children); /* pf0 é o pai de pf1 e pf3 */ printf("h = %d\n", height(pf0)); /* deve imiprimir 2 */ printf("n = %d\n", nb_of_children(pf0)); /* deve imprimir 2 */ printf("n = %d\n", nb_of_children(child(pf0, 0))); /* deve imprimir 0, porque o retorno de child é o filho de pf0, que é uma folha. */ deep_free_node(pf0); }
//uncompile FILE* outfile, outfile, void uncompile(FILE* outfile, Node *n){ int i; switch(n->type){ case nodo_coringa: case nodo_tipounico: case nodo_tipolista: case nodo_idf: case nodo_int: case nodo_float: case nodo_if: case nodo_while: case nodo_end: case nodo_else: case nodo_true: case nodo_false: fprintf(outfile,"%s ",n->lexeme); } for (i = 0; i < nb_of_children(n); i++) uncompile(outfile, child(n, i)); }
//deep_free_node int deep_free_node(Node* n){ int i; if(n != NULL){ for(i = 0; i < nb_of_children(n); i++) deep_free_node(child(n, i)); free(n); } return 0; }
//height int height(Node *n){ int max = 0, i, h; if(n != NULL){ for(i = 0; i < nb_of_children(n); i++){ h = height(child(n, i)); if(max < h) max = h; } max++; } return max; }
// Funcionando Node* child(Node* n, int i) { // Testa se o ponteiro dado é NULL if (n == NULL) { printf("ERRO! Ponteiro dado é NULL"); exit(-1); } // Testa se i está dentro do num_child do nodo recebido como parametro if ( (i < 0) || (i >= nb_of_children(n)) ) { printf("ERRO! Número índice incorreto (Fora do intervalo de filhos)"); exit(-1); } // Retorna i-ésimo filho requerido return n->child[i]; }