我正在编写一个使用二叉树数据结构的程序。在编写例程以释放所有节点时,我遇到了一个我无法解释的特殊问题。
这是例程:
void destroy_tree(NodeT **tree){
if( *tree != NULL ){
destroy_tree( &(*tree)->left );
free( (*tree)->left );
destroy_tree( &(*tree)->right );
free( (*tree)->right );
}
return;
}
基本上,一个2星指针被传递给该函数。它会在继续释放指针之前检查每个节点是否为NULL。 NodeT
是一个包含NodeT结构左右指针的结构;这些是我试图释放的指针。
结构定义为:
typedef struct{
int val;
struct tnode *right, *left;
}NodeT;
如果没有free()调用,没有任何事情像你期望的那样发生。但是,当取消注释免费调用时,输出如下所示:
每次运行程序时,数字块都会改变,但它们总是会重复,最终会发生崩溃。
您可能期望对此功能进行原始调用,
destroy_tree(&rootNode);
其中rootNode是:NodeT *rootNode
;
有什么想法吗?
答案 0 :(得分:3)
尝试释放当前节点:
void destroy_tree(NodeT **tree){
if( *tree != NULL ){
destroy_tree( &(*tree)->left );
destroy_tree( &(*tree)->right );
free(*tree);
}
return;
}
答案 1 :(得分:1)
你没有说你正在运行什么样的系统,但我猜测打印是来自堆诊断例程抱怨堆损坏。
所以问题可能是你的树实际上不是树 - NodeT
在树中出现两次(所以它是一个DAG),或者更糟糕的是,其中一个指针指向一个父(这是树中的循环。)其中任何一个都会导致堆损坏(未定义的行为),这可能导致任何事情发生。
我建议运行valgrind或其他一些堆调试工具来缩小范围,但是仍然无法告诉你真正的问题在哪里(这是创建树的代码中的某个地方) 。)