Huffman树的创建

来源:互联网 发布:php程序员简历项目经验 编辑:程序博客网 时间:2024/05/18 03:10

Huffman树,又称最优树,是一类带权路径长度最短的树。

在解决某些判定问题时,Huffman树可

#include <iostream>#include <cstring>using namespace std;#define MAXBIT      20#define MAXLEAF     30#define MAXNODE    59typedef struct{int bit[MAXBIT];int start;} HCodeType; typedef struct{int weight;int parent;int lchild;int rchild;} HNodeType;void HuffmanTree(HNodeType HuffNode[MAXNODE], int n){/* i、j: 循环变量,m1、m2:构造哈夫曼树不同过程中两个最小权值结点的权值,x1、x2:构造哈夫曼树不同过程中两个最小权值结点在数组中的序号。*/int i, j, m1, m2, x1, x2;for (i = 0; i<2 * n - 1; i++){HuffNode[i].weight = 0;HuffNode[i].parent = -1;HuffNode[i].lchild = -1;HuffNode[i].rchild = -1; }cout << "依次输入叶子结点的权值:"<<endl;for (i = 0; i<n; i++){cin>>HuffNode[i].weight;}for (i = 0; i<n - 1; i++){m1 = m2 = 32767; x1 = x2 = 0;for (j = 0; j<n + i; j++){if (HuffNode[j].weight < m1 && HuffNode[j].parent == -1){m2 = m1;x2 = x1;m1 = HuffNode[j].weight;x1 = j;}else if (HuffNode[j].weight < m2 && HuffNode[j].parent == -1){m2 = HuffNode[j].weight;x2 = j;}} HuffNode[x1].parent = n + i;HuffNode[x2].parent = n + i;HuffNode[n + i].weight = HuffNode[x1].weight + HuffNode[x2].weight;HuffNode[n + i].lchild = x1;HuffNode[n + i].rchild = x2;} } void huffmancode(HCodeType HuffCode[MAXLEAF], HNodeType HuffNode[MAXNODE],int n){HCodeType cd;int i, j,c,p;for (i = 0; i < n; i++){cd.start = n - 1;c = i;p = HuffNode[c].parent;while (p != -1) {if (HuffNode[p].lchild == c)cd.bit[cd.start] = 0;elsecd.bit[cd.start] = 1;cd.start--;  c = p;p = HuffNode[c].parent;   } for (j = cd.start + 1; j<n; j++){HuffCode[i].bit[j] = cd.bit[j];}HuffCode[i].start = cd.start;}cout << "各个结点的huffman编码依次是:"<<endl;for (i = 0; i<n; i++){for (j = HuffCode[i].start + 1; j < n; j++){cout<<HuffCode[i].bit[j];}cout << endl;}}int main(void){HNodeType HuffNode[MAXNODE];   HCodeType HuffCode[MAXLEAF];  int  n;cout << "输入叶子结点的个数:"<<endl;cin>>n;HuffmanTree(HuffNode, n);huffmancode(HuffCode,HuffNode,n);system("pause");return 0;}

以得到最佳的判定算法。

0 0
原创粉丝点击