你将如何在 C 中释放一个二叉树结构
How would you go around freeing a binary tree struct in C
我有一个简单的树结构
struct Node{
struct node *l;
struct node *r;
int value;
};
我应该如何释放这样一个结构,因为一个简单的 free(node) 将无法工作,因为它内部有 2 个指针。我是否必须从给定的根开始横穿整棵树,然后释放它的左、右,最后释放它自己?这是我应该如何解决这个问题?
void destroy_tree(struct Node *node){
if(node->r != NULL){
destroy_tree(node->r);
free(node->r);
}
if(node->l != NULL){
destroy_tree(node->l);
free(node->l);
}
free(node);
}
您应该按照后序遍历的顺序删除节点。
先删除左节点/右节点然后rightnode/leftnode然后root.
void del(node *root)
{
if(root) // if(root!=NULL) checking if root is null
{
del(root->left);
del(root->right);
free(root);
}
}
您的代码遵循相同的想法,但我展示了一种更简洁的方法。
void destroy_tree(struct Node *node){
if(node->r != NULL){
destroy_tree(node->r);
free(node->r); ----> redundant
}
if(node->l != NULL){
destroy_tree(node->l);
free(node->l); -----> redundant. You have already deleted it.
}
free(node);
}
你基本上是按照后序遍历
我建议使用递归并使用回溯阶段删除节点(因此从离开节点到根)。所以你正在以一种聪明的方式使用回溯 ;)
您可以遍历树释放每个节点。像这样 -
deallocate (node *root){
if (root==NULL)
return;
//now onto the recursion
deallocate(node->l)
deallocate(node->r)
free(node);
}
在您的代码中,您 free
节点两次,这是不需要的。
我有一个简单的树结构
struct Node{
struct node *l;
struct node *r;
int value;
};
我应该如何释放这样一个结构,因为一个简单的 free(node) 将无法工作,因为它内部有 2 个指针。我是否必须从给定的根开始横穿整棵树,然后释放它的左、右,最后释放它自己?这是我应该如何解决这个问题?
void destroy_tree(struct Node *node){
if(node->r != NULL){
destroy_tree(node->r);
free(node->r);
}
if(node->l != NULL){
destroy_tree(node->l);
free(node->l);
}
free(node);
}
您应该按照后序遍历的顺序删除节点。 先删除左节点/右节点然后rightnode/leftnode然后root.
void del(node *root)
{
if(root) // if(root!=NULL) checking if root is null
{
del(root->left);
del(root->right);
free(root);
}
}
您的代码遵循相同的想法,但我展示了一种更简洁的方法。
void destroy_tree(struct Node *node){
if(node->r != NULL){
destroy_tree(node->r);
free(node->r); ----> redundant
}
if(node->l != NULL){
destroy_tree(node->l);
free(node->l); -----> redundant. You have already deleted it.
}
free(node);
}
你基本上是按照后序遍历
我建议使用递归并使用回溯阶段删除节点(因此从离开节点到根)。所以你正在以一种聪明的方式使用回溯 ;)
您可以遍历树释放每个节点。像这样 -
deallocate (node *root){
if (root==NULL)
return;
//now onto the recursion
deallocate(node->l)
deallocate(node->r)
free(node);
}
在您的代码中,您 free
节点两次,这是不需要的。