哈夫曼树和哈弗曼编码小记

原本是数据结构课的作业……到后来没查,放着占内存,删了有点浪费,干脆扔在博客上吧……

 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='';
50             
51             q.push(node[i]);
52         }
53         printf("哈夫曼树:
"); 
54         for(int i=1;i<=2*n-1;i++)
55         {
56             printf("node %d: p=%d 	 lc=%d 	 rc=%d 	 c=%c 	 freq=%d
",node[i].num,node[i].parent,node[i].lchild,node[i].rchild,node[i].c,node[i].freq);
57         }
58         printf("哈夫曼编码:
"); 
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("
");
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://www.cnblogs.com/dilthey/p/6811484.html