求能建立最优二叉树函数,并且可以建立函数输入二叉树,并输出其哈夫曼树的源代码!以下供参考

Scofield_zao Scofield_zao 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区


#include <stdio.h>

#include <iostream.h>

typedef int ElemType;

#include "Haffman.h"

void main()

{

int n,i;

BTreeNode *fbt=NULL;

cout<<"输入待构造的哈夫曼树中带权叶子结点数n:";

cin>>n;

ElemType *a=new ElemType[n];

cout<<"输入"<<n<<"个整数作为权值:";

for(i=0;i<n;i++)

cin>>a[i];

fbt=CreatHuffman(a,n);

cout<<"构造的哈夫曼树为:"<<endl;

PrintBTree(fbt,n);

cout<<"树中每个叶子的哈夫曼编码:"<<endl;

HuffManCoding(fbt,0);

}

Haffman.h:

struct BTreeNode{

ElemType data;

BTreeNode *left;

BTreeNode *right;

};

BTreeNode *CreatHuffman(ElemType a[],int n) //构造哈夫曼树

{

BTreeNode **b,*q;

b=new BTreeNode*[n];

int i,j;

for(i=0;i<n;i++){

b[i]=new BTreeNode;

b[i]->data=a[i];

b[i]->left=b[i]->right=NULL;

}

for(i=1;i<n;i++){

int k1=-1,k2;

for(j=0;j<n;j++){

if(b[j]!=NULL&&k1==-1){

k1=j;

continue;

}

if(b[j]!=NULL){

k2=j;

break;

}

}

for(j=k2;j<n;j++){

if(b[j]!=NULL){

if(b[j]->data<b[k1]->data){

k2=k1;

k1=j;

}

else if(b[j]->data<b[k2]->data)

k2=j;

}

}

q=new BTreeNode;

q->data=b[k1]->data+b[k2]->data;

q->left=b[k1];

q->right=b[k2];

b[k1]=q;

b[k2]=NULL;

}

delete []b;

return q;

}

void PrintBTree(BTreeNode *BT,int n) //以广义表形式输出哈夫曼树

{

int i;

if(BT!= NULL){

PrintBTree(BT->right,n+1);

for(i=0;i<n-1;i++)

cout<<" ";

if(n>0)

cout<<"--";

cout<<BT->data<<endl;

PrintBTree(BT->left,n+1);

}

}

void HuffManCoding(BTreeNode *BT, int len) //求哈夫曼编码

{

static int a[10];

if(BT!=NULL){

if(BT->left==NULL&&BT->right==NULL){

cout<<"结点权值为"<<BT->data<<"的编码:";

for(int i=0;i<len;i++)

cout<<a[i]<<' ';

cout<<endl;

}

else{

a[len]=0;

HuffManCoding(BT->left, len+1);

a[len]=1;

HuffManCoding(BT->right, len+1);

}

}

}

...全文

相关推荐

评论 19
收藏 已收藏
分享
返回顶部
Scofield_zao
C++ 语言 65,214 成员 250,514 内容