C:如何为生成树释放内存?

时间:2011-03-22 12:06:29

标签: c malloc free nodes spanning-tree

我有一个只有父母和孩子的n-ary树结构。 spantree本身只包含一个节点,即根节点。然后创建与其他节点或根链接的节点。允许每个节点(包括根)最多具有MAXCHILDREN子节点。 这是结构:

typedef struct node{
    unsigned int id;                    //every node has different id
    struct node* parent;                //points to parent node
    struct node* children[MAXCHILDREN]; //pointers to all children of this node
}node;

typedef struct spantree{
    node root;                          //root node
}spantree;

视觉图片:

        root
      ___O
     /  / \ 
    O  O   O 
          / \
         O   O

在我创建了我的树之后,我想要解除整个事情,但我不确定以哪种方式来做。我无法从根目录中解除分配,因为树会被破坏。所以我想我必须从树叶开始到达根部? 但这意味着我必须先找到最深的叶子,对吧?我对如何开始感到很困惑。

我不认为这是必要的,但对于保险来说,这是我每次需要制作新节点时使用的内容:

node *newNode;
newNode=(node*)malloc(sizeof(node));
//then I modify it to my preferences

4 个答案:

答案 0 :(得分:4)

您需要检查您正在释放的节点是否有子节点,如果存在,则先将其释放。

    void free_node( node *n ) {
    if(n) { 
      for(int i=0; i<MAXCHILDREN; i++)
        free_node(n->children[i]);
      free(n);
      }
    }

答案 1 :(得分:3)

通过树递归,首先调用递归函数,然后释放内存。

void deleteNode(node * Node) {
  for (int i = 0; i < MAXCHILDREN; ++i) {
    if (node->children[i]) {
      deleteNode(node->children[i]);
      free(node->children[i]);
    }
  }
}

答案 2 :(得分:1)

你是对的,你需要使用自己喜欢的遍历函数来查找叶子,然后在释放父节点之前释放它们。一旦孩子们被释放,你基本上就有了另一个叶节点,然后你就可以自由了。

您需要使用递归。享受!

答案 3 :(得分:0)

您听说过有关POST-ORDER遍历的任何信息?您使用相同的技术删除所有节点。这会在删除所有子女后自动删除父母。