我有一个简单的树结构
struct Node{
struct node *l;
struct node *r;
int value;
};
我应该如何释放这样一个结构,因为它有一个简单的免费(节点)工作,因为它有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);
}
答案 0 :(得分:2)
您应该按照后序遍历的顺序删除节点。 首先删除左节点/右节点,然后删除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);
}
你基本上都是关注后序遍历。
答案 1 :(得分:0)
我建议使用递归并使用回溯阶段删除节点(因此从离开节点到根节点)。所以你以聪明的方式使用回溯;)
答案 2 :(得分:0)
您可以遍历树,释放每个节点。像这样的东西 -
deallocate (node *root){
if (root==NULL)
return;
//now onto the recursion
deallocate(node->l)
deallocate(node->r)
free(node);
}
在您的代码中,您free
节点两次不需要。