c - 销毁双线程二叉树
问题描述
所以我们被要求实现双线程二叉树。它们为我们提供了所涉及的函数声明和结构,我们应该提供函数定义。
二叉树节点的结构:
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;
解决方案
问题在于:free(t);
不分配,所以不应该释放它。tree_destroy
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 的初始tree_destroy
包含free
将是正确的解决方案,但main
应该这样称呼它们:
Tree *my_tree = tree_initialize();
if (!my_tree) /* ERROR */
.
.
.
tree_destroy(my_tree);
请注意,对 malloc 的额外检查在调用中Tree
分配tree_initialize
和main
不存在以及在其他函数(如和用作参数)中失败。&
tree_destroy
tree_insert
tree_delete
Tree *
推荐阅读
- firebase - 如何制作像生物编辑器一样的 Tinder - Flutter-firebase
- c# - 将 MySQL 查询中项目的嵌套列表属性映射到对象
- css - 如何使用 CSS 更改悬停时缩进列表项的背景颜色?
- c# - .NET 中的异步/等待用法
- javascript - react-bootstrap navbar 折叠时不会将内容向下推
- r - 使用 {patchwork} 组装的 ggplots 之间不需要的分隔标记/线条
- typescript - 如何重用接口上的泛型参数?
- amazon-web-services - 从 AWS Lambda 函数运行:可以看到 CloudWatch 日志,但在 axios 的延续中除外
- c++ - 从不同线程同步调用公共函数
- r - 分析从移动眼动仪获得的眼动和头部运动数据