请教最优二叉树的建立与HuffmanCode的建立的问题。

wjfkog1985 2007-04-24 10:58:32
用数组承载树叶。然后完成2叉树的建立以及HuffmanCode的添加,一道实验作业,请高手帮忙看看,谢谢
源程序如下:

#include<iostream>
using namespace std;
#define Max 30
typedef struct HuffNode
{
int Data;
int LchildPosion;
int RchildPosion;
int TFag;
int Parent;
int HuffCode;
}HuffNode;

int main()
{

HuffNode TreeNode[Max];//建立Huffman Tree
cout <<"请确认叶子的个数"<<endl; int N;
cin >> N;
for(int i=0;i<(2*N-1);i++)//初始化所有节点
{
TreeNode[i].Data=5000;
TreeNode[i].LchildPosion=0;
TreeNode[i].RchildPosion=0;
TreeNode[i].TFag=0;
TreeNode[i].Parent=0;
TreeNode[i].HuffCode=2;
}

cout <<"请输入叶子的权值"<<endl;
for(i=0;i<N;i++)
{
cin >>TreeNode[i].Data;
}
cout <<"runing"<<endl;//测试
int x1=5000,x2=5000;
int p1,p2;
for(i=0;i<(2*N-1);i++)//生成huffman树
{
if((TreeNode[i].Data<x1) && (TreeNode[i].TFag==0))
{
x2=x1;
x1=TreeNode[i].Data;
p1=i;//记录最小权叶子的位置p1
}
else
if((TreeNode[i].Data<x2) && (TreeNode[i].TFag==0))
{
x2=TreeNode[i].Data;
p2=i;//记录次小权叶子的位置p2
}
for(int k=N;k<2*N-1;k++)
{
TreeNode[k].Data=x1+x2;
TreeNode[k].LchildPosion=p1;
TreeNode[k].RchildPosion=p2;
TreeNode[p1].Parent=k;
TreeNode[p2].Parent=k;
TreeNode[p1].TFag=1;//"废除"当次最小权叶子
TreeNode[p2].TFag=2;//"废除"当次次小权叶子
TreeNode[p1].HuffCode=0;//左叶huffcode置0
TreeNode[p2].HuffCode=1;//右叶huffcode置1
}
}
for(i=0;i<2*N-1;i++)
{
cout <<" "<<TreeNode[i].Parent<<endl;
cout << TreeNode[i].LchildPosion<<" "<<TreeNode[i].Data<<" "<<TreeNode[i].RchildPosion<<endl;
cout <<" "<<TreeNode[i].HuffCode<<endl;
/*输出形如 Parent
LCP Data RCP
HuffCode
类型的数据*/
}
return 0;


}
该程序能够编译,但是运行的时候有错误,不能正确运行(windows提示有错误)请高手帮忙解决,小弟不胜感激
...全文
428 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
asuo_asuo 2008-12-04
  • 打赏
  • 举报
回复
能不能改进一下啊?
asuo_asuo 2008-12-04
  • 打赏
  • 举报
回复
不知道..这个运行结果正确性如何?这个运行结果好象不怎么明显的体现出HaffmanCode..
jixingzhong 2007-04-25
  • 打赏
  • 举报
回复
晕死!

调试后发现:
int p1=0,p2=0;

加上初始化即可。
因为 没有初始化的时候,
第一次循环中,p1 p2 只有一个被赋值为 i,
另外一个是一个随机值(通常这个随机值很大), 那么后面的
TreeNode[p1].Parent=k;
TreeNode[p2].Parent=k;
TreeNode[p1].TFag=1;//"废除"当次最小权叶子
TreeNode[p2].TFag=2;//"废除"当次次小权叶子
TreeNode[p1].HuffCode=0;//左叶huffcode置0
TreeNode[p2].HuffCode=1;//右叶huffcode置1
中就有一些语句是越界访问的了 ~
jixingzhong 2007-04-25
  • 打赏
  • 举报
回复
看糊涂了, 晕.....
jixingzhong 2007-04-25
  • 打赏
  • 举报
回复
for(int k=N;k<2*N-1;k++)
==》
for(int k=N;k<2*N-1;k--) //++越界了!!
jixingzhong 2007-04-25
  • 打赏
  • 举报
回复
for(i=0;i<(2*N-1);i++)//生成huffman树

需要知道 N 的值是多少?

在开始,
定义的只有HuffNode TreeNode[Max]; //最多数组索引不超过 Max 就是 30!
如果2*N-1超过了这个范围,那么后面的 TreeNode[i] 就是越界访问,可能会运行时刻出错~

后面的k也是一样的,需要看看 N的范围,不要越界访问数组空间 ~
小金8 2007-04-25
  • 打赏
  • 举报
回复
帮顶!
wjfkog1985 2007-04-25
  • 打赏
  • 举报
回复
再to:(jixingzhong(瞌睡虫·星辰))
看了你后面的教导,确实如此!!!谢谢高手指点哈!!看来这个初始化问题还是要特别注意滴!!谢谢!!
wjfkog1985 2007-04-25
  • 打赏
  • 举报
回复
to:(jixingzhong(瞌睡虫·星辰))
由于是个实验性程序,所以这个n值是人工确定到2*N-1<30的。这个是人为控制的。但是,就算是这个N控制到2*N-1<30以内,还是会出现这个错误。

65,213

社区成员

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

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