求助数据结构赫夫曼树从根到叶子的非递归遍历的问题
哈夫曼树从根到叶子的非递归遍历算法:
//从根到叶遍历哈夫曼树
//我分析时用书上的权重为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; //然后开始了无尽的循环。。。。
}
}
}
各位大神啊,帮帮我脱离这思想中的死循环吧,我到底哪理解错了