贪心算法构造哈夫曼树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件02 1311611006 张松彬利用贪心算法构造哈夫曼树及输出对应的哈夫曼编码
问题简述:
两路合并最佳模式的贪心算法主要思想如下:
(1)设w={w0,w1,......wn-1}是一组权值,以每个权值作为根结点值,构造n棵只有根的二叉树
(2)选择两根结点权值最小的树,作为左右子树构造一棵新二叉树,新树根的权值是两棵子树根权值之和
(3)重复(2),直到合并成一颗二叉树为
一、实验目的
(1)了解贪心算法和哈夫曼树的定义(2)掌握贪心法的设计思想并能熟练运用(3)设计贪心算法求解哈夫曼树(4)设计测试数据,写出程序文档
二、实验内容
(1)设计二叉树结点数据结构,编程实现对用户输入的一组权值构造哈夫曼树(2)设计函数,先序遍历输出哈夫曼树各结点3)设计函数,按树形输出哈夫曼树
代码:
#include
#include
#include
#include
typedef struct Node{ //定义树结构
int data;
struct Node *leftchild;
struct Node *rightchild;
}Tree;
typedef struct Data{ //定义字符及其对应的频率的结构
int data;//字符对应的频率是随机产生的
char c;
};
void Initiate(Tree **root);//初始化节点函数
int getMin(struct Data a[],int n);//得到a中数值(频率)最小的数
void toLength(char s[],int k);//设置有k个空格的串s
void set(struct Data a[],struct Data b[]);//初始化a,且将a备份至b
char getC(int x,struct Data a[]);//得到a中频率为x对应的字符
void prin(struct Data a[]);//输出初始化后的字符及对应的频率
int n;
void main()
{
//srand((unsigned)time(NULL));
Tree *root=NULL,*left=NULL,*right=NULL,*p=NULL; int min,num;
int k=30,j,m;
struct Data a[100];
struct Data b[100];
int i;
char s[100]={'\0'},s1[100]={'\0'};
char c;
set(a,b);
prin(a);
Initiate(&root);
Initiate(&left);
Initiate(&right);
Initiate(&p);
//设置最底层的左节点
min=getMin(a,n);
left->data=min;
left->leftchild=NULL;
left->rightchild=NULL;
//设置最底层的右节点
min=getMin(a,n-1);
right->data=min;
right->leftchild=NULL;
right->rightchild=NULL;
root->data=left->data+right->data;
Initiate(&root->leftchild);
Initiate(&root->rightchild);
//将设置好的左右节点插入到root中
root->leftchild=left;
root->rightchild=right;
for(i=0;i { min=getMin(a,n-2-i); Initiate(&left); Initiate(&right); if(min { left->data=min; left->leftchild=NULL; left->rightchild=NULL; p->data=min+root->data; Initiate(&p->leftchild); Initiate(&p->rightchild); p->leftchild=left; p->rightchild=root; root=p; } else { right->data=min; right->leftchild=NULL; right->rightchild=NULL; p->data=min+root->data; Initiate(&p->leftchild); Initiate(&p->rightchild); p->leftchild=root; p->rightchild=right; root=p; } Initiate(&p); } num=n-1; p=root; printf("哈夫曼树如下图:\n"); while(num) { if(num==n-1) { for(j=0;j printf(" "); printf("%d\n",root->data); } for(j=0;j printf(" "); printf("/ \\\n"); for(j=0;j printf(" "); printf("%d",root->leftchild->data); printf(" %d\n",root->rightchild->data); if(root->leftchild->leftchild!=NULL) { root=root->leftchild; k=k-2; } else { root=root->rightchild; k=k+3;