【发布时间】:2025-11-25 13:50:01
【问题描述】:
我正在尝试用二叉搜索树构建一棵霍夫曼树。可悲的是我的代码崩溃了(分段错误(核心转储))。
struct 是这样定义的:
struct Node
{
unsigned char m_ch;
int m_freq;
struct Node *m_ls,*m_rs;
struct Node *m_hls,*m_hrs;
};
delMin 被传递一个指向二叉搜索树的双指针,并从中删除最左边的叶子,除非它到达带有m_ch==0 的节点并返回删除的节点
我找不到我的错误
struct Node *delMin(struct Node **root)
{
struct Node *current = *root;
struct Node *b4Current;
if (current == NULL)
return NULL;
while (current->m_ls != NULL)
{
if (current->m_ch == 0)
break;
b4Current = current;
current = current->m_ls;
}
if (current->m_ch == 0)
b4Current->m_ls = NULL;
else
{
if (b4Current == NULL)
*root = current->m_rs;
else
b4Current->m_ls = current->m_rs;
}
return current;
}
struct Node *huffman(struct Node *root)
{
struct Node *left;
struct Node *right;
struct Node *tempRoot;
struct Node *huffmanTree;
while (root->m_ch != 0)
{
left = delMin(&root);
right = delMin(&root);
tempRoot = createNode((left->m_freq) + (right->m_freq), 0);
tempRoot->m_hls = left;
tempRoot->m_hrs = right;
insertTree(&root, tempRoot);
}
huffmanTree = tempRoot;
return huffmanTree;
}
编辑:为Huffman 调用的insertTree 函数添加了代码
void insertTree(struct Node **root,struct Node *n)
{
if (!*root)
{
*root=n;
return;
}
if(n->m_freq<(*root)->m_freq)
{
insertTree(&((*root)->m_ls),n);
}
else
{
insertTree(&((*root)->m_rs),n);
}
}
【问题讨论】:
-
使用调试器或插入
puts()调用来确定发生故障的确切位置。然后跟踪关联的逻辑,找出问题所在。 -
可能违反分段的候选者是
while (root->m_ch) ...:从树中删除最后一个节点后,root是NULL,您不能使用->取消引用它。所以while (root)应该没问题。 -
如果
root是一个满足current->m_ls != NULL和current->m_ch==0的节点,则delMin()的while 循环立即退出。由于current->m_ch==0,进入测试并执行b4Current->m_ls=NULL;。但是b4Current没有初始化:可以触发分段错误。 -
while (root) 启动一个 inf 循环 @MOehm
-
好的,我看到您通过插入带有
m_ch == 0的虚拟节点使事情变得过于复杂。但是你没有展示你是如何构建二叉树的。
标签: c binary-tree binary-search-tree huffman-code