普通的哈夫曼树,不知道哪里错了,运行结果不符合

lengyuenanfeng 2014-07-25 01:20:23
代码如下:
//哈夫曼树的C++描述
#include<iostream>
#include<string.h>
using namespace std;
struct HNode
{
int weight;
int lchild, rchild, parent;
};
//huffman编码表C++描述:
struct HCode
{
char data;
char code[100];
}; //字符及其编码结构

class Huffman
{
private:
HNode* huffTree; //Huffman树
HCode* HCodeTable; //Huffman编码表
public:
void CreateHTree(int a[], int n); //创建huffman树
void CreateCodeTable(char b[], int n); //创建编码表
void Encode(char *s, char *d); //编码
void Decode(char *s, char *d,int n); //解码
~ Huffman();
};


void SelectMin(HNode*a,int n,int*b)//从结点数组中选出最小的两个
{
int min1,min2;
min1=a[0].weight<a[1].weight?a[0].weight:a[1].weight;
min2=a[0].weight^a[1].weight^min1;
b[0]=0;
b[1]=1;
for(int i=2;i<n;i++)
{
if(a[i].weight<min1)
{
min2=min1;
min1=a[i].weight;
b[1]=b[0];
b[0]=i;
}
else if(a[i].weight<min2)
{
min2=a[i].weight;
b[1]=i;
}
}
}
void Huffman::CreateHTree(int a[], int n)//初始化Huffman树
{ //根据权重数组a[1->n] 初始化Huffman树
huffTree = new HNode [2*n-1];
for (int i = 0; i < n; i++)
{ huffTree[i].weight = a[i];
huffTree[i].lchild = -1;
huffTree[i].rchild = -1;
huffTree[i].parent = -1;
cout<<huffTree[i].weight<<" "<<huffTree[i].lchild<<" "<<huffTree[i].rchild<<" "<<huffTree[i].parent<<endl;
}
int re[2];
int li, ri;
for (int i = n; i < 2*n-1; i++) //开始建Huffman树
{ //从0~i-1中选出两个权值最小的结点,
SelectMin(huffTree, n, re);
li=re[0],ri=re[1];
huffTree[li].parent = huffTree[ri].parent = i;
huffTree[i].weight = huffTree[li].weight+ huffTree[ri].weight;
huffTree[i].lchild = li;
huffTree[i].rchild = ri;
huffTree[i].parent = -1;
}
for(int i=n;i< 2*n-1;i++)
cout<<huffTree[i].weight<<" "<<huffTree[i].lchild<<" "<<huffTree[i].rchild<<" "<<huffTree[i].parent<<endl;
}
void Reverse(char*p)
{
int n=strlen(p);
char change[n];
for(int j=0;j<n;j++)
{
change[j]=p[j];
}
for(int f=0;f<n;f++)
{
p[f]=change[n-1-f];
}
}
void Huffman::CreateCodeTable(char b[],int n)
{
HCodeTable=new HCode[n];
for(int i=0;i<n;i++)
{
HCodeTable[i].data=b[i];
int child=i;
int parent=huffTree[i].parent;
int k=0;
while(parent!=-1)
{
if(child==huffTree[parent].lchild)
HCodeTable[i].code[k]='0';
else
HCodeTable[i].code[k]='1';
k++;
child=parent;
parent=huffTree[child].parent;
}
HCodeTable[i].code[k]='\0';
Reverse(HCodeTable[i].code);
cout<<HCodeTable[i].data<<" "<<HCodeTable[i].code<<endl;
}
}
void Huffman::Decode(char*s,char*d,int n)//解码,s为编码串,d为解码后的字符串
{
while(*s!='0')
{
int parent=2*n-1-1;
while(huffTree[parent].lchild!=-1)
{
if(*s=='0')
parent=huffTree[parent].lchild;
else
parent=huffTree[parent].rchild;
s++;
}
*d=HCodeTable[parent].data;
d++;
}
}
Huffman::~Huffman()
{
int m,n;
m=sizeof(huffTree)/sizeof(huffTree[0]);
for(int i=0;i<m;i++)
{
delete huffTree++;
}
n=sizeof(HCodeTable)/sizeof(HCodeTable[0]);
for(int j=0;j<n;j++)
{
delete HCodeTable++;
}
}
int main()
{
int binary[5]={21,2,5,633,7};
char zifu[10]={'a','b','c','d','e','f','g','h','i','j'};
Huffman hafuman;
hafuman.CreateHTree(binary,5);
hafuman.CreateCodeTable(zifu, 5);
char b[100];



}
...全文
188 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lengyuenanfeng 2014-10-29
  • 打赏
  • 举报
回复
最后发现是指针没有初始化
gqonkzrm 2014-07-25
  • 打赏
  • 举报
回复
不太懂。。。
树叶上的蜗牛 2014-07-25
  • 打赏
  • 举报
回复
单步调试一下吧

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧