求助数据结构赫夫曼树从根到叶子的非递归遍历的问题

qqqgreet 2012-05-31 06:59:11
哈夫曼树从根到叶子的非递归遍历算法:
//从根到叶遍历哈夫曼树
//我分析时用书上的权重为7、5、2、4分析赫夫曼编码的,最终cd数组得出的结果应为0 10 110 111
//前缀编码示例图链接 http://ettc.sysu.edu.cn/2005wlkc/shujujiegou/teaching/chapter6/chapter6-5-4.html
//为什么我觉得程序一直在第一步0这里一直循环
void HuffmanTreeRead(int n)
{
HC = (HuffmanCode)malloc((n + 1) * sizeof(char *));
m = n * 2 - 1;
p = m;
cdlen = 0;
for ( i = 1; i <= m; ++i)
{
HT[i].weight = 0; //遍历赫夫曼时weight用作结点状态标志,开始都设置为0
}

while(p) //开始时p为根
{
if(HT[p].weight == 0) //开始时执行这里
{
HT[p].weight = 1;
if (HT[p].lchild != 0) //头结点有左子树,所以顺序执行这里
{
p = HT[p].lchild; //将根节点的左子树给p,此时本例中p结点为叶子节点
cd[cdlen++] = '0'; //得到cd存储的赫夫曼编码为0
}
else if(HT[p].rchild == 0) //上面的if执行了,这里else if肯定不执行
{
HC[p] = (char *)malloc((cdlen + 1) * sizeof(char));
cd[cdlen] = '/0';
strcpy(HC[p],cd);
}
}
else if(HT[p].weight == 1) //第二次while循环从这里开始执行
{
HT[p].weight = 2;
if (HT[p].rchild != 0) //此时p结点为叶子节点,无左右子树故不满足要求不执行
{
p = HT[p].rchild;
cd[cdlen++] = '1';
}
}
else //第三次while循环执行这里
{
HT[p].weight = 0;
p = HT[p].parent; //又将当前结点的双亲结点给p,即p又变成了根节点 --cdlen; //然后开始了无尽的循环。。。。
}
}

}


各位大神啊,帮帮我脱离这思想中的死循环吧,我到底哪理解错了
...全文
80 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
giant7 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
哈夫曼树从根到叶子的非递归遍历算法:
//从根到叶遍历哈夫曼树
//我分析时用书上的权重为7、5、2、4分析赫夫曼编码的,最终cd数组得出的结果应为0 10 110 111
//前缀编码示例图链接 http://ettc.sysu.edu.cn/2005wlkc/shujujiegou/teaching/chapter6/chapter6-5-4.html
//为什么我觉得程序一直在第一步……
[/Quote]


在利用哈弗曼编码时,创建哈弗曼树,楼主是不是只记录了实际意义上的编码,对于其他节点(递归过程中产生的新节点,比如2,4 结合的父节点权值为6)没有进行相应的编码---这里我指的是根结点。
所有编码应该是:00 010 0111 0110.
如果根结点(这里权值是18)没有对应编码,很容易出错。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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