无记忆功能打印随机数字与二叉树实现

时间:2013-10-30 15:46:01

标签: c pointers binary-tree

我正在编写一个使用二叉树数据结构的程序。在编写例程以释放所有节点时,我遇到了一个我无法解释的特殊问题。

这是例程:

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()调用,没有任何事情像你期望的那样发生。但是,当取消注释免费调用时,输出如下所示:

enter image description here

每次运行程序时,数字块都会改变,但它们总是会重复,最终会发生崩溃。

您可能期望对此功能进行原始调用,

destroy_tree(&rootNode); 

其中rootNode是:NodeT *rootNode;

有什么想法吗?

2 个答案:

答案 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或其他一些堆调试工具来缩小范围,但是仍然无法告诉你真正的问题在哪里(这是创建树的代码中的某个地方) 。)