SSL 1407哈夫曼树哈夫曼树(哈夫曼树知识)
Posted SSL_ZZL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSL 1407哈夫曼树哈夫曼树(哈夫曼树知识)相关的知识,希望对你有一定的参考价值。
【树】哈夫曼树一
题目
Description
假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为7、19、2、6、32、3、21、10。试为这8个字母设计哈夫曼编码。如果用二进制数表示这8个字母的编码方案.(请按照左子树根节点的权小于等于右子树根节点的权的次序构造)
Input
第一行为字母的个数n;
第二行至第n+1行分别为各个字母在电文中出现的频率;
Output
按照中序遍历输出各个编码
Sample Input
8
7
19
2
6
32
3
21
10
Sample Output
19:00
21:01
2:10000
3:10001
6:1001
7:1010
10:1011
32:11
哈夫曼树
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100;
struct DT
int data, l, r, addr;
f[maxn + 5], a[maxn + 5];
int n;
void selectsort(int k)
for(int i = 1; i < k; i ++)
for(int j = i + 1; j <= k; j ++)
if(a[i].data > a[j].data)
swap(a[i], a[j]);
return;
void vist(int t)
if(f[t].data == 0) return;
printf("%d ", f[t].data);
vist(f[t].l);
vist(f[t].r);
return;
int main()
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i].data);
f[i].data = a[i].data;
a[i].addr = i;
int t = n + 1, i = n;
while(i > 1)
selectsort(i);
f[t] = (DT)a[1].data + a[2].data, a[1].addr, a[2].addr;
a[1].data = f[t].data, a[1].addr = t;
a[2].data = a[i].data, a[2].addr = a[i].addr;
t ++, i --;
vist(t - 1);
解题思路
哈夫曼树模板
Code
#include <iostream>
#include <cstdio>
using namespace std;
struct DT
int data, l, r, addr;
a[200], f[200];
int n;
void selectsort(int x) //从小到大排序
for(int i = 1; i < x; i ++)
for(int j = i + 1; j <= x; j ++)
if(a[i].data > a[j].data) swap(a[i], a[j]);
void print(int x, string s)
if(f[x].addr == -1) //叶子节点,也就是原始序列中的点
cout << f[x].data << ":" << s << endl;
return;
print(f[x].l, s + '0'), print(f[x].r, s + '1');
int main()
scanf("%d", &n);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i].data);
f[i].data = a[i].data, a[i].addr = i, f[i].addr = -1;
int t = n + 1;
for(int i = n; i > 1; i --, t ++)
selectsort(i);
f[t] = (DT) a[1].data + a[2].data, a[1].addr, a[2].addr ; //选最小的两个合并
a[1].data = f[t].data, a[1].addr = t; //更新点
a[2].data = a[i].data, a[2].addr = a[i].addr;
print(t - 1, "");
以上是关于SSL 1407哈夫曼树哈夫曼树(哈夫曼树知识)的主要内容,如果未能解决你的问题,请参考以下文章