2012-11-05 245 views
0

我正在實現從二叉搜索樹中刪除節點的功能。 該功能的原型已設置,我無法更改它,它是一個學校作業。 我的代碼:二叉搜索樹節點刪除

typedef struct tBSTNode { 
    char Key;                 
    struct tBSTNode * LPtr;         
    struct tBSTNode * RPtr; 
} *tBSTNodePtr; 

void BSTDelete (tBSTNodePtr *RootPtr, char K) { 
    tBSTNodePtr *tmp; 

    if (*RootPtr != NULL) { 
    if (K < (*RootPtr)->Key) 
     BSTDelete(&(* RootPtr)->LPtr, K); 
    else if (K > (*RootPtr)->Key) 
     BSTDelete(&(* RootPtr)->RPtr, K); 
    else { 
      if ((* RootPtr)->LPtr == NULL) { 
       /* there is only right branch or none*/ 
       tmp = RootPtr; 
       *RootPtr = (* RootPtr)->RPtr; 
       free(*tmp); 
       *tmp = NULL; 
      } 
      else if ((* RootPtr)->RPtr == NULL) { 
       /* there is only left branch or none*/ 
       tmp = RootPtr; 
       *RootPtr = (* RootPtr)->LPtr; 
       free(*tmp); 
       *tmp = NULL; 
      } 
      else 
       /* there are both branches, but that is for another topic*/ 
     } 
    } 
} 

此代碼工作正常,以防萬一在沒有連接到我刪除節點分支。我期望* tmp = NULL;線,我失去了我的地址到其餘的分支,但另一方面,如果這條線不包括我得到一個SEGFAULT,我想弄清楚爲什麼。

編輯:

好的,現在我知道錯誤在哪裏了。這是愚蠢的錯誤,我應該使用tBSTNodePtr tmp;而不是tBSTNodePtr * tmp;

回答

0

您刪除的邏輯是在此代碼錯誤

if ((* RootPtr)->LPtr == NULL) { 
       /* there is only right branch or none*/ 
       tmp = RootPtr; 
       *RootPtr = (* RootPtr)->RPtr; 
       free(*tmp); 
       *tmp = NULL; 
      } 

要刪除所需的節點,但不能添加節點

if ((* RootPtr)->LPtr == NULL) { 
       /* there is only right branch or none*/ 
       tmp = RootPtr; 
       *RootPtr = (* RootPtr)->RPtr; 
       free(*tmp); 
       *tmp = NULL; 
       insert(RootPtr); //insert the child node again in the tree 
      } 
+0

不幸的是,我不允許調用另一個函數insert(),所以我需要使用我已經顯示的代碼 – skornos

1

你有使用指針問題的孩子根本。如果我們有sometype *ptr,並且我們檢查這個ptr是否符合我們編寫的一些空間(ptr!=NULL)*ptr指的是這個值本身,比如你的structre。 瞭解C中指針類型的更多信息。

+0

是的我知道在C和I中使用指針的概念我正在使用它,因爲你可以看到。但是在指針邏輯中有一個問題,你的回答沒有清除任何東西 – skornos

+0

哦,對不起。我沒有注意到typedef中的'*'。 –

+0

我想我找到了。這是錯誤的邏輯。如果沒有左側孩子和右側孩子,則同時輸入兩個if和free兩次。下面說的是非常正確的,這是問題的關鍵。但我想你應該在條件中加上&&(* RootPtr) - > otherside!= NULL',以便你的程序工作更加正確。 –