首页 > 解决方案 > 销毁双线程二叉树

问题描述

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

二叉树节点的结构:

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;

标签: crecursiondata-structuresbinary-tree

解决方案


问题在于:free(t);不分配,所以不应该释放它。tree_destroytree_initializestruct treetree_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 的初始tree_destroy包含free将是正确的解决方案,但main应该这样称呼它们:

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

请注意,对 malloc 的额外检查在调用中Tree分配tree_initializemain不存在以及在其他函数(如和用作参数)中失败。&tree_destroytree_inserttree_deleteTree *


推荐阅读