/** * Função Caminho * @brief Função que gera a codificação de cada letra * Funcao que recebe como parametros um no @param no, um vetor de caracteres @param str, um inteiro @param i e um caractere @param c, que sao utilizados para gerar * a codificação dos bits relativos a cada caractere da string a ser comprimida, em que um @return int é retornado para o usuário dependendo de cada caso de verificacao * no primeiro caso se o no for nulo retorna-se 0, o que significa que a função nao foi executada com sucesso, já se o a letra contida no nó for diferente de zero e * a letra for igual ao caractere c o vetor de string ira receber o valor correspondente ao lado podendo ser zero para direita e um para esquerda, contudo se nenhuma * condição foi atendida a função é chamada recursivamente até satisfazer a condição anterior, gerando assim a codificação */ int caminho (No* no, char* str, int i, char c) { if (no == NULL) { return 0; } else if (no->letra!=0 && no->letra == c) { str[i] = no->lado; return 1; } else { int n = caminho(no->filhoesq, str, i+1, c); if (n==0) { n = caminho(no->filhodir, str, i+1, c); if (n==0) { return 0; } else { str[i] = no->lado; return 1; } } else { str[i] = no->lado; return 1; } } }
void LCAlista_por_caminho(Arvoreb *R, Nodo_lca *l, int n){ Arvoreb *p; /* Busco a folha, e a partir dela faco o caminho ate a raiz. */ p = ARVOREBBusca(R,n,n); caminho(p->pai,l); }
/** * Função Construir o Codigo da Tabela * @brief Funcao que gera o codigo que ira ser inserido na tabela para posterior uso de codificacao e decodificacao * Dada a entrada de uma árvore de huffman @param h e uma matriz de caracteres @param tabela[][MIN] é posivel gerar uma codificacao para ser reaproveitada posteriormente * em uma tabela, essa tabela é gerada percorrendo-se a arvore de huffman com a função caminho (@see caminho) e atraves dela anotar a letra e o codigo correspondente a essa letra * na matriz de caracteres */ void construir_tabela_codigo (Huffman* h, char tabela[][MIN]) { int i = 0, j = 0; char str[MIN]; zerar_palavra(str); for (i=1; i<TOTSIM; i++) { if (h->frequencia_letras[i]>0) { caminho(h->cabeca->proximo, str, 0, (char) i); for (j=1; str[j]!=0; j++) { tabela[i][j-1] = str[j]; } zerar_palavra(str); } } }
void caminho(Arvoreb *R, Nodo_lca *l){ LCAAdiciona(l,R); if(R->pai != NULL) caminho(R->pai,l); }