SSL 1407哈夫曼树哈夫曼树(哈夫曼树知识)

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSL 1407哈夫曼树哈夫曼树(哈夫曼树知识)相关的知识,希望对你有一定的参考价值。

【树】哈夫曼树一

SSL 1407【树】哈夫曼树(一)
1408 【树】哈夫曼树(二) 题解
1409 【树】哈夫曼树(三) 题解


题目

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哈夫曼树哈夫曼树(哈夫曼树知识)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构知识点——哈夫曼树

哈夫曼编码测试

Python---哈夫曼树---Huffman Tree

Python---哈夫曼树---Huffman Tree

哈夫曼树课程实验报告--C++

结构(哈夫曼树)