销毁双线程二叉树
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_initialize
和 main
的 Tree
分配中失败并且 tree_destroy
调用中缺少 &
以及在 tree_insert
和 tree_delete
等其他函数中使用 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_initialize
和 main
的 Tree
分配中失败并且 tree_destroy
调用中缺少 &
以及在 tree_insert
和 tree_delete
等其他函数中使用 Tree *
作为参数..