【发布时间】:2016-09-26 22:59:54
【问题描述】:
我正在尝试编写一个递归函数,该函数在霍夫曼树中定位一个特定的叶子,然后用零和一打印其最短路径(零是向左遍历,一个是向右遍历)。我理解我需要做的事情的逻辑,但我在实际实施它时没有成功。我相信我在这里有一个很好的骨架,但是我缺少的部分是一些更复杂的逻辑来告诉我什么时候应该实际运行 printf 以及什么时候不应该运行(因为这目前只打印每个零和一)。另外,我知道除此之外的其余逻辑都可以正常工作,因为如果您进行正常遍历而不必绘制最短路径,则会找到我正在搜索的每个元素。
我已经尝试在网上查看很多资源,但我找不到解决方案,或者至少我无法正确识别解决方案。我可能已经重写了 50 次或更多次。让我知道你的想法!
void traverse(struct tree *curr, struct tree *cmp)
{
if (curr == NULL)
{
return;
}
if (getLeft(curr) == NULL && getRight(curr) == NULL)
{
if (curr == cmp)
{
return;
}
}
if (getLeft(curr) != NULL)
{
printf("0");
traverse(getLeft(curr), cmp);
}
if (getRight(curr) != NULL)
{
printf("1");
traverse(getRight(curr), cmp);
}
}
对于上下文:cmp 是我们要查找的节点,getLeft() 和 getRight() 分别返回节点的左右子节点,curr 作为 Huffman 树本身的根开始。另外,这个 printf 事情起作用的原因是因为我遍历所有已知的叶子,打印关于叶子的其他信息,然后调用这个遍历方法,然后是一个换行符。
【问题讨论】:
标签: c recursion tree traversal huffman-code