构造哈夫曼树,并且最终输出带权路径长度
下面是源程序,但是但是程序开头包含的一个头文件和另外一个保存二叉树各种操作的实现的文件都不知道写,不知道哪位高手能小弟指点一下不,就是这两句包含的内容不会
#include"binarytree.h"
#include"binarytreeimple.cpp"
源程序如下
#include"binarytree.h" //保存二叉树的类型定义和操作声明
//假定ElmType被定义为整形int
#include"binarytreeimple.cpp" //保存对二叉树各种操作的实现
BTreeNode* CreateHuffman(ElemType a[],int n) //根据数组中a中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;
//让k1初始指向森林中第一棵树,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;
}
ElemType WeightPathLength(BTreeNode*FBT, int len)
//根据FBT指针所指向的哈夫曼树求出带权路径长度,len初值为0
{
if(FBT==NULL) return 0;
else {
if(FBT->left==NULl&&FBT->right==NULL){
return FBT->data*len;
}
//路径长度之和,向下深入一层时len值增1
else {
return WeightPathLength(FBT->left,len+1)+
WeightPathLength(FBT->right,len+1);
}
}
}
void main()
{
cout<<"从键盘输入待构造的哈夫曼树中带权叶子结点数n:";
int n;
while(1) {cin>>n;if(n>1) break; else cout<<"重输n值:";}
cout<<"输入"<<n<<"个权值";
ElemType* a=new ElemType[n];
for(int i=0;i<n;i++) cin>>a[i];
//根据数组a建立哈夫曼树
BTreeNode* fbt=CreateHuffman(a,n);
//以广义表形式输出哈夫曼树
cout<<<"广义表形式的哈夫曼:";
PrintBTree(fbt); cout<<endl;
//输出哈夫曼树的权值,即带权路径长度
cout<<"哈夫曼树的权:";
cout<<WeightPathLength(fbt,o)<<endl;
//清除以bt为树根指针的二叉树
ClearBTree(fbt);
}