我有一个树形结构 node {node * left,node * right}。 我这样填写: 让我们说A是根。 孩子A1和A2。 然后是A11和A12,是A11的孩子。 最后A12(= A21)和A22是A22的孩子。 所以A11和A12有一个共同的孩子,我没有复制孩子,我们只有A12 = A21(在地址方面)。 但是要释放树,我唯一的方法是使用recursif函数: 释放树T(由指针节点*表示),释放两个子子(如果它们存在)(即非NULL),然后使用free(T)。 问题是当recursif调用在A21上时,指针将被释放(因为A21 = A12并且之前在A12上发出recursif调用),这会导致问题。 我该怎么解决? 感谢。
EDIT。 我试图通过在结构中添加一个代表正确兄弟的新字段来修复它, 它可能有效,因为valgrind没有注意到任何记忆丧失:D。
#include <stdio.h>
#include <stdlib.h>
struct node{
struct node *lc, *rc, *bro; // left child, right child, brother
};
typedef struct node node;
void release(node *n)
{
if(n->lc)
release(n->lc);
if(n->rc){
if(n->bro) // in that case, n and n->bro have a common node
n->bro->lc = NULL; // so i set it to NULL because it must be released only once
release(n->rc);
}
free(n);
}
int main()
{
node *A22 = malloc(sizeof *A22);
A22->lc = A22->rc = A22->bro = NULL;
node *A21 = malloc(sizeof *A21);
A21->lc = A21->rc = NULL;
A21->bro = A22;
node *A2 = malloc(sizeof *A2);
A2->lc = A21;
A2->rc = A22;
A2->bro = NULL;
node *A11 = malloc(sizeof *A11);
A11->lc = A11->rc = NULL;
A11->bro = A11;
node *A12 = A21; // the duplicated node
node *A1 = malloc(sizeof *A1);
A1->lc = A11;
A1->rc = A12;
A1->bro = A2;
node *A = malloc(sizeof *A); // root
A->lc = A1;
A->rc = A2;
A->bro = NULL;
release(A);
return 0;
}
答案 0 :(得分:0)
它很粗糙,但你可以维护一个被释放的节点的全局列表(按每个节点的地址),这样你就可以引用它并避免重新释放任何节点。