6-1 哈夫曼树及哈夫曼编码

6-1 哈夫曼树及哈夫曼编码 (10 分)

函数SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2)是从1到upbound中找出father为0的节点赋给s1,s2,(为了保证答案唯一,请让s1的节点编号小于s2),函数HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)是构造哈夫曼树以及计算哈夫曼编码。保证输入的权重值小于1000。
函数接口定义:
void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2);
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n);
其中 upbound 编号,HT是哈夫曼树,HC是哈夫曼编码,w是权值,n是叶子节点个数。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
int weight;
int parent;
int lchild;
int rchild;
} HTNode, *HuffmanTree;
typedef char ** HuffmanCode;

void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2);
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n);

int main() {
HuffmanTree ht;
HuffmanCode hc;

int n;
scanf("%d", &n);

int *w = (int *) malloc (n * sizeof(int));
for(int i = 0; i < n; ++ i)
    scanf("%d", &w[i]);

HuffmanCoding(ht, hc, w, n);

for (int i = 1; i <= 2 * n - 1; ++ i) {
    printf("%d %d %d %d\n", 
    ht[i].weight, ht[i].parent, ht[i].lchild, ht[i].rchild);
}

for (int i = 1; i <= n; ++ i)
    printf("%s\n", hc[i]);

free(w);
free(ht);
for (int i = 1; i <= n; ++ i)
    free(hc[i]);

return 0;

}
/* 你的代码将被嵌在这里 */
输入格式:
第一行输入一个数n,表示叶子节点的个数,接下去输入n个整数,表示每个节点的值
输出格式:
只要建树即可,输出已经确定了
输入样例:
4
1 2 3 4
输出样例:
1 5 0 0
2 5 0 0
3 6 0 0
4 7 0 0
3 6 1 2
6 7 3 5
10 0 4 6
110
111
10
0
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
   
    int weight;
    int parent;
    int lchild;
    int rchild;
} HTNode, *HuffmanTree;
typedef char ** HuffmanCode;

void SelectTwoMin(int upbound, HuffmanTree HT, int &s1, int &s2);
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n);

void reverse(char *CH)
{
   
	int n=strlen(CH);
	int i;
	for (i=0; i<n/2;i++)
	{
   
		char temp;
		temp = CH[i];
		CH[i] 
  • 12
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值