你将如何在 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 节点两次,这是不需要的。