Red de conocimiento informático - Aprendizaje de código fuente - Estructura de datos árbol binario óptimo

Estructura de datos árbol binario óptimo

Esta es nuestra pregunta de tarea, la escribí yo mismo... (El formato de entrada puede no ser consistente con lo que quieres, cámbialo tú mismo)

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<<""<padre<<""<lchild<<""<rchild<<" " <peso<

}.

}

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

}

<); p>else if(k ==2){

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>

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>b[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

}

}

}