回 帖 发 新 帖 刷新版面

主题:[讨论]请教大家一个关于哈夫曼树的问题

构造哈夫曼树,并且最终输出带权路径长度
下面是源程序,但是但是程序开头包含的一个头文件和另外一个保存二叉树各种操作的实现的文件都不知道写,不知道哪位高手能小弟指点一下不,就是这两句包含的内容不会
#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);
}

回复列表 (共3个回复)

沙发

1。首先赫夫曼树的存储结构你得给出啊
2。其次,除了PrintBTree,你没有用到什么二叉树其他的操作啊
3。建议找本数据结构的书看看

板凳

偶看了半天都还是不会写..没有基本概念.
boxertony可以告诉我怎么写不.

3 楼

.h文件用于类,结构体的定义和各函数,成员函数的申明,具体实现写成另外一个.cpp,是这样组织的。

比如:
list.h里定义链表的结构和申明各种操作的接口
list.cpp(可以是其它任何文件名)里先#include "list.h"然后实现具体操作
做完了之后,在测试程序load.cpp中只要#include "list.h"就可以使用里面的类了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册