我有一个只有父母和孩子的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
答案 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遍历的任何信息?您使用相同的技术删除所有节点。这会在删除所有子女后自动删除父母。