私は、データ構造を見ていた(清華大学存在するもの)
コーディングの重要性の2ページの説明
私はこの本は、コードの詳細は彼らの練習の一部を達成するために、明確ではなかったと言うでしょう
コード
#include <ビット/ STDC ++。H> 名前空間stdを使用。 CONST int型N = 1E3 + 10。 BOOLねじ[N]。 構造体のtypedef { int型の重量; int型の親、lchild、rchild。 } HTNode、* HuffmanTree。 ハフマン符号のcharのtypedef **。 = 0になりましたint型。 無効を選択(HuffmanTree&HT、int型CUR、INT&S1、S2のint&、int型のn) { 今++; int型のval = 1E6; 、B int型。 以下のために(int型I = 1; I <= CUR、iは++) { 場合(VIS [i]は)引き続き、使用されていない場合は、//それを使用することができます (HT [I] .weight <val)であれば { ヴァル= HT [I] .weight。 = I; } } S1 = A; AM [N] = 1。 ヴァル= 1E6; 以下のために(int型I = 1; I <= CUR、iは++) { もし(VIS [i])と続けます。 (HT [I] .weight <val)であれば { ヴァル= HT [I] .weight。 B = I; } } S2 = B。 [B]午前= 1。 // coutの<<今すぐ<< "" << S1 << "" << S2 <<てendl; (> N && B <= n)のスワップ(S1、S2)の場合; //は、一つのリーフノードnを入れなければならない、ということに留意され } void Huffmancoding(HuffmanTree& HT, Huffmancode& HC, int* w, int n) { if (n <= 1) return; int m = 2 * n - 1; HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));//0号不用 int i; for (i = 1; i <= n; ++i) HT[i] = { w[i],0,0,0 }; for (; i <= m; ++i) HT[i] = { 0,0,0,0 }; for (i = n + 1; i <= m; ++i) { int s1, s2; Select(HT, i - 1, s1, s2,n);//书上没写这个函数, HT[s1].parent = i, HT[s2].parent = i; //统一把小的放在左边,书上的不一致p148那个图有问题 HT[i].lchild = s1, HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; } //从叶子结点到根逆向求每个字符的哈夫曼编码 //分配n个字符编码的头指针向量 HC = (Huffmancode)malloc((n + 1) * sizeof(char*)); //分配求编码的工作空间 char* cd = (char *)malloc(n * sizeof(char)); cd[n - 1] ='\0'; int cur, f,start; for (i = 1; i <= n; i++) { int cnt = n - 1; //cout << i << endl; for (cur = i, f = HT[i].parent; f != 0; cur = f, f = HT[f].parent) { // cout << f << " "; if (HT[f].lchild == cur) cd[--cnt] = '0'; else cd[--cnt] = '1'; } //puts(""); HC[i] = (char *)malloc((n - cnt) * sizeof(char)); strcpy(HC[i],&cd[cnt]);//从cnt这个地方开始复制 } free(cd); } int main() { int n; int a[100]; memset(vis,0,sizeof(vis)); HuffmanTree HT; Huffmancode HC; cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; Huffmancoding(HT, HC, a, n); for (int i = 1; i <= n; i++) { cout << i << " " << a[i] << " " << HC[i] << endl; } return 0; } //8 //5 29 7 8 14 23 3 11