2011-03-30 41 views
0

我正在對二叉搜索樹進行編碼,並且在找到有效刪除節點的方法時遇到了一些問題。使用免費(N)刪除BST中的節點

我有這樣的代碼:

struct node* deleteNode(int i, struct node *N) 

{ 
    if (N==NULL) 
    { 
     return NULL; 
    } 
    else if (i<N->value) 
    { 
     N->size--; 
     N->lChild=deleteNode(i,N->lChild); 
    } 
    else if (i>N->value) 
    { 
     N->size--; 
     N->rChild=deleteNode(i,N->rChild); 
    } 
    else if (N->lChild==NULL) 
    { 
     return N->rChild; 
    } 
    else if (N->rChild==NULL) 
    { 
     return N->lChild; 
    } 
    else 
    { 
     N->size--; 
     N->value=findMin(N->rChild); 
     N->rChild=deleteNode(N->value,N->rChild); 
    } 
    return N; 
} 

和n是具有5個字段的節點結構:值,lChild,rChild,大小,高度。 其實我在做什麼這裏是爲了使樹不向我要刪除,但與節點,當我試圖把一樣的東西:

else if (N->rChild==NULL) 
    { 
     free(N); 
     N=NULL; 
     return N->lChild; 
    } 

或者每一項類似尋找代碼,它不起作用。請有人指點我正確的方向嗎? 謝謝。

回答

0

首先你要說N = NULL,然後調用N> lchild N爲空並且沒有指向任何東西,那麼你如何獲得lchild值呢?

由於這是作業,我不會給出直接的答案,但提示。

要刪除節點,請檢查它是否有子節點,如果它沒有釋放節點並刪除它的引用,如父節點ptr。 如果它有一個孩子交換指向您想要與子節點刪除的節點並釋放該節點的ptr。如果你也有兩個孩子,這同樣適用。

+0

爲這樣的事情添加評論 – 2011-03-30 16:26:05

+0

我現在要編輯其餘的內容.... – 2011-03-30 16:26:32

+0

是的,這是一個不好的例子,但是即使我不把N = NULL;當啓動時,程序崩潰。 (所以只有免費(N);顯然他不喜歡我在釋放N後使用N->東西),問題是我真的不知道該把它放在哪裏。 – Sword22 2011-03-30 16:28:35