哈夫曼树和哈弗曼编码小记
原本是数据结构课的作业……到后来没查,放着占内存,删了有点浪费,干脆扔在博客上吧……
1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<vector> 5 #include<stack> 6 #define maxn 10000+5 7 using namespace std; 8 9 int n; 10 struct Node{ 11 int num;//节点编号 12 int lchild,rchild,parent;//节点的父节点、左子节点、右子节点 13 char c; 14 int freq;//字母出现的频率 15 bool operator<(const Node &oth)const 16 { 17 return freq>oth.freq; 18 }//重定义小于号运算符,使得结构体之间可以进行大小比较 19 }node[maxn]; 20 21 int main() 22 { 23 while(scanf("%d",&n)!=EOF) 24 { 25 priority_queue<Node> q; 26 for(int i=1;i<=n;i++)//输入 27 { 28 cin>>node[i].c>>node[i].freq; 29 node[i].num=i; 30 node[i].lchild=0; 31 node[i].rchild=0; 32 node[i].parent=0; 33 q.push(node[i]); 34 } 35 for(int i=n+1;i<=2*n-1;i++)//建树 36 { 37 Node x,y; 38 x=q.top(); q.pop(); 39 y=q.top(); q.pop(); 40 41 node[x.num].parent=i; 42 node[y.num].parent=i; 43 44 node[i].num=i; 45 node[i].lchild=x.num; 46 node[i].rchild=y.num; 47 node[i].parent=0; 48 node[i].freq=x.freq+y.freq; 49 node[i].c='\0'; 50 51 q.push(node[i]); 52 } 53 printf("哈夫曼树:\n"); 54 for(int i=1;i<=2*n-1;i++) 55 { 56 printf("node %d: p=%d \t lc=%d \t rc=%d \t c=%c \t freq=%d\n",node[i].num,node[i].parent,node[i].lchild,node[i].rchild,node[i].c,node[i].freq); 57 } 58 printf("哈夫曼编码:\n"); 59 for(int i=1;i<=n;i++)//输出 60 { 61 stack<bool> output; 62 Node now=node[i]; 63 while(now.parent!=0) 64 { 65 if(now.num == node[now.parent].lchild)//当前节点是其父节点的左子节点 66 output.push(0); 67 else //当前节点是其父节点的右子节点 68 output.push(1); 69 now=node[now.parent]; 70 } 71 printf("%c : ",node[i].c); 72 while(!output.empty()) 73 { 74 printf("%d",output.top()); 75 output.pop(); 76 } 77 printf("\n"); 78 } 79 } 80 } 81 82 /* 83 测试数据: 84 6 85 f 5 86 e 9 87 c 12 88 b 13 89 d 16 90 a 45 91 */
转载请注明出处:https://dilthey.cnblogs.com/