贪心算法构造哈夫曼树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(mindata)//权值小的作为左节点

{

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;

相关文档
最新文档