Estructura de datos árbol binario óptimo
Si no entiendes nada, puedes preguntarme Puedo, te enviaré todos los archivos relevantes ^^
Nota: 1. Hay tres opciones para inicializar el árbol de Huffman al compilar datos de prueba de libros de texto y archivos fuente, los archivos de entrada son: prueba. .txt y input.txt; el código de letras Huffman se guarda en el archivo: hmfTree.txt;
2 En el modo definido por el usuario, el contenido del archivo a codificar se guarda en ToBeTran. txt; los datos de prueba del libro de texto y los códigos de archivo fuente se guardan en course.txt; los datos de prueba del libro de texto y los códigos de archivo fuente se guardan en course.txt respectivamente; los datos de prueba del libro de texto y los códigos del archivo fuente se guardan en hmfTree.txt respectivamente. Los códigos se guardan en course.txt y sorse.txt respectivamente. Si se seleccionan diferentes opciones en (1), se llamará al archivo correspondiente para codificarlo durante la codificación y el resultado de la codificación se guardará en el archivo CodeFile.txt.
3. Decodificación de archivos, se llama al archivo CodeFile.txt durante la decodificación y el resultado de la decodificación se guarda en el archivo TextFile.txt.
4. Imprimir archivo de código: Llame a CodeFile.txt, el resultado se muestra en el terminal y se guarda en el archivo CodePrin.txt.
5. Imprima el árbol de Huffman: utilice la forma de tabla cóncava para mostrar el árbol de Huffman en la terminal y guárdelo en el archivo TreePrint.txt.
#include
#include
#include
# incluir
#include
#include
Usar espacio de nombres std
typedef struct {
unsigned int peso;
char ch1;
unsigned int parent,lchild,rchild
}HTNode,*HuffmanTree;
p>typedef char **HuffmanCode;
typedef struct {
char ch
código char[7]; >}codenode,*code;
void select(HuffmanTree HT,int n,int & s1,int &s2){ //Seleccione los dos nodos más pequeños del árbol de Huffman
para (int i=1;i& lt;=n;i++)
if(!HT[i].parent){
s1=i; p>}
for(i++;i<=n;i++)
if(!HT[i].parent){
s2=i; romper
}
if(HT[s1].peso-HT[s2].peso){
int temp= s1= s2; s2=temp;
}
for(i=1;i<=n;i++) //Recorre la matriz.
Encuentra los dos nodos más pequeños
if(!HT[i].parent){
if(HT[i].weight p> s2=s1; s1=i; } si(HT[i].peso< ;HT[s2].peso&&i!= s1) p> s2=i } } } } void prin(){ // Salida de terminal para seleccionar menú cout<<"-------------------- - ----- -----------------------\n\n" <<" ∣ I---Creando Árbol de Huffman ∣\n" <<" ∣ ∣\n" <<" ∣ E---Codificación de archivos ∣\n" < <" ∣ ∣\n " <<" ∣ D--Decodificación de documentos∣\n" <<" ∣ ∣\n" < <" ∣ P-- Imprimir archivo de código∣\n" <<" ∣∣\n" <<" ∣ T--- Impresión del árbol de Huffman∣/n " <<" ∣ ∣\n" <<" ∣ O--- Estructura de almacenamiento del árbol de Huffman∣/n" << " ∣ ∣ \n" <<" ∣ Q--Salir∣\n" <<" \n- ------------ --------------------------------------\n\n"; printf("Selección de opciones de funciones del menú: "); } } salida nula (HuffmanTree th,int n) lt;< "right hijo "<<" "<< "pesos"<<< endl; for(;i<2*n-1;i++){ th++; cout<ch1<<""< }. } void inicial(HuffmanTree &HT,HuffmanCode &HC,int w[],int &n,char ch[],int &k){ //crear árbol de Huffman salto<<"------------------------------------------ --- ----------\n\n" <<" ∣ 1--- personalizado ∣\n" <<" ∣ ∣ \n" <<" ∣ 2--Codificación de datos de pruebas de libros de texto ∣\n" <<" ∣ ∣\n" <<" ∣ 3- -Codificación del programa fuente∣\n" <<" \n--------------------- ----- - -----------------------\n\n"; printf("Selección de la opción de función del menú: "); scanf("%d",&k); if(k==1){ printf("Introduciendo el número total de caracteres a codificar:") ; scanf("%d",&n); printf("\nIngrese el peso de los caracteres a codificar: \n"); for(int d=0;d scanf("%d",&w[d]); /p> printf("\n cadena de entrada a codificar: "); scanf("%s",ch } ifstream fin2 ("test.txt"); fin2>>n; d=0;d< n;d++) fin2>>w[d]; fin2>>ch fin2.close(); } else if(k==3){ ifstream fin1 ("input.txt"); >n; for(int d=0;d fin1>>w[d]; fin1.close(); } if(n<=1) return; >int s1,s2, i,num=2*n-1; HuffmanTree p; HT=(HuffmanTree)malloc ((num+1)*tamañode(HTNode) for(p=HT+1,i=1;i<=n;i++,p++){ p->peso=w[i-1]; p->lchild=0 ; p->padre=0; =0; p->ch1 =ch[i-1]; } for(;i<=num;p++,i++){ p->peso=0; p->lchild=0; p->padre=0; p->rchild =0; p->ch1 ='$'; p>} for(i=n+1;i<=num;i++){ select(HT,i-1,s1,s2); HT[s1].padre=i; HT[s2].padre=i; HT[i].lchild=s1; HT[i].rchild=s2; .peso=HT[s1].peso+HT[s2].peso } } HC=n+1;i<=num; ;i++){ select(HT,i-1,s1,s2); HT[s1].parent=i; [i]. HC=(HuffmanCode)malloc((n+1)*sizeof(char * )); char * temp=(char *)malloc(n*) tamaño de (char)); temp[n-1]='\0'; for(i=1;i<=n;i++){ int inicio=n-1; for (int f=HT[i].parent,h=i;f;h=f,f=HT[f].parent) p> p> if(HT[f].lchild==h) temp[--start]='0' else temp[--start]='1'; HC[i]=(char *)malloc((n-start)*sizeof(char)); strcpy( HC[i],&temp[inicio]); } f(HT[f]. ofstream fout ("hfmTree.txt " fout< for(int j=1;j<=n;j++) fout< fout.close(); libre(temp); } codificación nula (int); n, int select){ //codificación: decodificar archivo TobeTran.txt char a[100],b[100][20] ifstream fin (" hfmTree.txt ") ; fin>>a; for(int j=0;j fin. close(); ifstream fin1 ("curso.txt" ifstream fin2 ("sorse.txt"); "ToBeTran .txt"); char s[1000] if(select==3) < /p> fin2>>s; else si(select==2) fin1>>s else fin3>>s; ; ofstream fout ("CodeFile.txt"); while(s[0]! = '\0'){ for(int i). =0;s[i]! = '\n'&&s[i]! = '\0'&&i<30;i++ ){ for(int g=0;a[g]! = s[i];g++); fuera< } fuera<<'\n'; if(select==3) fin2>>s; si no(select==2) fin1>>s; /p> else fin3>>s; } fin3.close(); fin2.close(); fin1.close(); fout.close(); } fin3.close(); fin2.close(); fin1.close(); fout. void decoding(HuffmanTree ht,int n){ // Decodificación: decodificación Archivo CodeFile.txt ifstream fin ("CodeFile.txt"); ofstream fout ("TextFile.txt"); ; fin>>s; HuffmanTree cabeza=ht+2*n-1 int i=0; mientras(s[0]!= '\0'){ mientras(s[i]!= '\0'){ if(s[i]== '1') cabeza=ht+cabeza->rchild; else if(s[i]=='0') cabeza=ht+cabeza->lchild if; ((head->lchild)==0& amp;&(head->rchild) ==0) { fout<<(head->ch1 head); =ht+2*n-1; } i++; } fuera<&CodePrin.txt"); /p> ifstream fin ("CodeFile.txt"); char s[2000] int j=0 int i; =1; fin>>s; ofstream fout (" CodePrin.txt"); '){ for(;s[j]! = '\0';j++){ printf("%c",s[j]); > fuera< if(i%50==0){ fuera<& lt;endl; printf("\n"); } i++; >j=0; fin>>s; } fin.close(); "); fout.close(); } fout. void printTree( nodo HuffmanTree, nodo1 HuffmanTree, int nivel) { //imprime la forma del árbol de Huffman (en términos de transferencia de parámetros, este es el consejo que me dio Wenke, que resuelve muy bien los problemas en operaciones posteriores ^^) break; p>} scanf("%c",&c } } }