王卓《数据机构与算法》——哈夫曼树记录
#include <iostream>
#include <vector>
#include < cstring >
#include <string.h>
using namespace std;
typedef struct
{
int weight;
int parent, lch, rch;
}HTNode,*HuffmanTree;
void InitHTree(HuffmanTree &HT, const int n)
{
if (n < 1)
return;
HT = new HTNode[2 * n];
for (int i = 1; i < 2 * n; ++i)
{
HT[i].parent = HT[i].lch = HT[i].rch = 0;
}
int input;
for (int i = 1; i <= n; ++i)
{
cin >> input;
HT[i].weight = input;
}
}
void Select1(HuffmanTree HT,const int n, int &s1, int &s2)
{
int i;
for (i = 1; i <= n; i++)
{
if (HT[i].parent == 0)
{
s1 = i;
break;
}
}
for (i = s1 + 1; i <= n; i++)
{
if (HT[i].parent == 0)
{
s2 = i;
break;
}
}
if (HT[s2].weight < HT[s1].weight)
{
int temp;
temp = s1;
s1 = s2;
s2 = temp;
}
for (i = s2 + 1; i <= n; i++)
{
if ((HT[i].weight < HT[s1].weight) && (HT[i].parent == 0))
{
s2 = s1;
s1 = i;
}
if ((HT[i].weight >= HT[s1].weight) && (HT[i].weight < HT[s2].weight) && (HT[i].parent == 0))
{
s2 = i;
}
}
}
void Select(HuffmanTree &HT, const int n, int &s1, int &s2)
{
vector<int> v;
for (int i = 1; i <= n; i++)
{
if (HT[i].parent == 0)
{
v.push_back(i);
}
}
auto flag1 = v.begin();
for (auto it = v.begin(); it != v.end(); ++it)
{
if (HT[*it].weight < HT[*flag1].weight)
{
flag1 = it;
}
}
s1 = *flag1;
v.erase(flag1);
auto flag2 = v.begin();
for (auto it = v.begin(); it != v.end(); ++it)
{
if (HT[*it].weight < HT[*flag2].weight)
{
flag2 = it;
}
}
s2 = *flag2;
}
void CreateHuffmanTree(HuffmanTree &HT, const int n)
{
InitHTree(HT, n);
int i;
for (i = n + 1; i < 2*n; i++)
{
int s1=0, s2 = 0;
Select(HT, i - 1, s1, s2);
HT[i].weight = HT[s1].weight + HT[s2].weight;
HT[i].lch = s1;
HT[i].rch = s2;
HT[s1].parent = i;
HT[s2].parent = i;
}
}
void CreateHuffmanCode(HuffmanTree HT, char** &HC, int n)
{
HC = new char*[n + 1];
char* cd = new char[n];
cd[n - 1] = '\0';
int i;
for (i = 1; i <= n; i++)
{
int start = n - 1;
int c = i;
int f = HT[i].parent;
while (f != 0)
{
--start;
if (HT[f].lch == c)
{
cd[start] = '0';
}
if (HT[f].rch == c)
{
cd[start] = '1';
}
c = f;
f = HT[f].parent;
}
HC[i] = new char[n - start];
strcpy(HC[i],&cd[start]);
}
delete[] cd;
}
void PrintHT(HuffmanTree HT, int n)
{
int m = 2 * n - 1;
cout << "weight" << "\tparent" << "\tlch" << "\trch" << endl;
for (int i = 1; i <= m; i++)
{
cout << HT[i].weight << " \t" << HT[i].parent << " \t" << HT[i].lch << " \t" << HT[i].rch << " \t" << endl;;
}
}
void PrintHTCode(HuffmanTree HT, char** HC, int n)
{
cout << "哈夫曼编码如下:" << endl;
for (int i = 1; i <= n; i++)
{
cout << "频率为" << HT[i].weight << "的符号的哈夫曼编码为:" << HC[i] << endl;
}
}
int main() {
HuffmanTree HT;
CreateHuffmanTree(HT,8);
char** HC;
CreateHuffmanCode(HT, HC, 8);
PrintHT(HT, 8);
PrintHTCode(HT, HC, 8);
system("pause");
return 0;
}