Common.h
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define NULL 0
Huffman.h
typedef struct
{
int weight;
int parent, lchild, rchild;
}HTNode, * HuffmanTree;
typedef char** HuffmanCode;
void Select(HuffmanTree HT, int len, int& s1, int &s2);
void CreatHuffmanTree(HuffmanTree& HT, int n);
void CreatHuffmanCode(HuffmanTree HT, HuffmanCode& HC,int n);
void ShowHuffmanCode(HuffmanTree HT, HuffmanCode HC, int n);
void MainHuffCode();
Tree.h
typedef struct BiNode
{
char data;
struct BiNode* lchild, * rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree& T);
void InOrderTraverse(BiTree T);
void InOrderTree();
Huffman.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "Huffman.h"
#include <iostream>
using namespace std;
void Select(HuffmanTree HT, int len, int& s1, int& s2)
{
int i, min1 = 0x6f6f6f6f, min2 = 0x6f6f6f6f;
for (i = 1;i <= len;i++)
{
if(HT[i].weight<min1&&HT[i].parent==0)
{
min1 = HT[i].weight;
s1 = i;
}
}
int temp = HT[s1].weight;
HT[s1].weight = 0x6f6f6f6f;
for (i = 1;i <= len;i++)
{
if (HT[i].weight < min2&& HT[i].parent == 0)
{
min2= HT[i].weight;
s1 = i;
}
}
HT[s1].weight = temp;
};
void CreatHuffmanTree(HuffmanTree& HT, int n)
{//构造哈夫曼树HT
int m, s1, s2, i;
if (n <= 1)return;
m = 2 * n - 1;
HT = new HTNode[m + 1];
for ( i = 1;i <= m;++i)
{
HT[i].parent = 0;HT[i].lchild = 0;HT[i].rchild = 0;
}
cout << "请输入叶子结点的权值:\n";
for ( i = 1;i <= n;++i)
cin >> HT[i].weight;
for (int i = n + 1;i <= m;++i)
{
int s1, s2;
Select(HT, i - 1,s1, s2);
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
}
void CreatHuffmanCode(HuffmanTree HT, HuffmanCode& HC, int n)
{
HC = new char* [n + 1];
char* cd = new char[n];
cd[n - 1] = '\0';
for (int i = 1;i <= n;++i)
{
int start = n - 1;
int c = i;
int f = HT[i].parent;
while (f != 0)
{
--start;
if (HT[f].lchild == c)
cd[start] = '0';
else
cd[start] = '1';
c = f;
f = HT[f].parent;
}
HC[i] = new char[n - start];
strcpy(HC[i], &cd[start]);
}
delete[] cd;
}
void ShowHuffmanCode(HuffmanTree HT, HuffmanCode HC, int n)
{
for (int i = 1;i <= n;i++)
cout << HT[i].weight << "编码为" << HC[i] << endl;
};
void MainHuffCode()
{
HuffmanTree HT;
HuffmanCode HC;
int n;
cout << "请输入叶子结点的个数:\n";
cin >> n;
CreatHuffmanTree(HT,n);
CreatHuffmanCode( HT,HC,n);
ShowHuffmanCode( HT,HC,n);
getchar();
getchar();
};
main.cpp
#include "Huffman.h"
//#include "tree.h"
int main()
{
//InOrderTree();
MainHuffCode();
};
Tree.cpp
#include "Tree.h"
#include <iostream>
using namespace std;
void CreateBiTree(BiTree& T)
{
char ch;
cin >> ch;
if (ch == '#') T = NULL;
else
{
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{
if (T)
{
InOrderTraverse(T->lchild);
cout << T->data;
InOrderTraverse(T->rchild);
};
};
//ABC##DE#G##F###
void InOrderTree()
{
BiTree tree;
cout << "请输入建立二叉链表的序列:\n";
CreateBiTree(tree);
cout << "所建立的二叉链表中序序列:\n";
InOrderTraverse(tree);
cout << endl;
};