销毁双线程二叉树

Destroying a double threaded binary tree

所以我们被要求实现双线程二叉树。他们给了我们所涉及的函数声明和结构,我们应该给出函数定义。

二叉树节点结构:

typedef struct node
{
    int data;
    struct node *left;
    struct node *right;
    int rightThread;
    int leftThread;
} Node;

树结构:

typedef struct tree
{
    Node *root;
} Tree;

现在我不知道他们为什么要求我们使用两种结构(一种用于树,一种用于节点)来实现这一点,但我们无法更改这些。

到目前为止,我已经设法将节点插入到线程树中,等等,但是我在销毁树时遇到了麻烦

我们被要求以下列方式实现它:

void tree_destroy(Tree *tree);
{
   //TODO
}

void destroy(Node *r)
{
    //TODO
}

我是这样实现的:

void destroy(Node *r)
{

    if(r==NULL)
        return;
   {
    destroy(r->left);
    destroy(r->right);
    }
    free(r);
}

void tree_destroy(Tree *t)
{
    if(t->root==NULL) return;
    destroy(t->root);
    free(t);
}

但是我的代码似乎有问题,因为存在分段错误。有人可以帮我发现它或者有其他方法来实现给定的功能吗?

编辑:

主函数调用:

Tree my_tree;
tree_initialize(&my_tree);
.
.
.
tree_destroy(&my_tree);

函数tree_initialize:

void tree_initialize(Tree *tree)
{
    tree->root=NULL;
}

当我必须向树中添加一个新节点时,我按以下方式对其进行初始化:

Node* newnode=(Node*)malloc(sizeof(Node));
newnode->data=data;
newnode->left=newnode->right=NULL;
newnode->rightThread=newnode->leftThread=1;

tree_destroy 中的 free(t); 是问题所在:tree_initialize 没有分配 struct tree,所以 tree_destroy 不应该释放它。

函数的原型tree_initialize假设和代码

Tree my_tree;
tree_initialize(&my_tree);
.
.
.
tree_destroy(&my_tree);

使 my_tree 成为堆栈变量,而不是堆变量,它不能也不应该被释放。

不过,有一种方法可以使Tree结构成为堆变量。在这种情况下 tree_initialize 应该看起来像

Tree *tree_initialize()
{
    Tree tree = malloc (sizeof(tree));
    if (!tree) return NULL;
    tree->root=NULL;
    return tree;
}

你的初始 tree_destroy 包含 free for Tree 将是正确的解决方案,但 main 应该这样称呼它们:

Tree *my_tree = tree_initialize();
if (!my_tree) /* ERROR */
.
.
.
tree_destroy(my_tree);

请注意 malloc 的额外检查在 tree_initializemainTree 分配中失败并且 tree_destroy 调用中缺少 & 以及在 tree_inserttree_delete 等其他函数中使用 Tree * 作为参数..