2014-09-22 74 views
0

我有一個樹形結構 node {node * left,node * right}。 我用這種方式填充它: 讓我們說A是根。 A1和A2的孩子。 然後是A11和A12,並且是A11的子女。 ,最後A12(= A21)和A22是A22的孩子。 所以A11和A12有一個共同的孩子,我沒有複製孩子,我們只有A12 = A21(地址方面)。但是爲了釋放樹,唯一的方法是使用recursif函數: 釋放樹T(它由一個指針節點*表示),釋放子子節點(如果它們存在的話)(即不是NULL),然後使用免費(T)。 問題是,當recursif調用在A21上時,指針將會被釋放(因爲A21 = A12,並且A12上的recursif調用是在之前產生的),這會導致問題。 我該如何解決它? 謝謝。在堆上釋放內存,特殊樹

編輯。 我試圖通過在代表正確兄弟 的結構中添加一個新字段來解決此問題,並且它可能起作用,因爲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

任何代碼/代碼片段? – Samer 2014-09-22 17:56:28

+0

目前尚不清楚您如何決定何時「重複使用」兒童。 – 2014-09-22 17:56:47

回答

0

的原油,但你可以保持釋放(由每個地址)節點的全局列表,讓你可以參考它,並避免重新釋放的任何節點。