您将如何在C中释放二叉树结构

时间:2015-08-25 16:15:44

标签: c free

我有一个简单的树结构

  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);
  }

3 个答案:

答案 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节点两次不需要。