2013-10-24 134 views
1

我正試圖從二叉樹函數中刪除。我有點失落,所以我試圖處理它的情況下,開始如果我試圖刪除的價值是在BST的根。爲了測試我的函數,我首先調用printcontents()函數來打印樹的所有內容,然後調用remove(8)[8此時是我的根目錄中的值),然後調用printcontents( )。我這樣做的方式是試圖用樹左側的「最右側」值替換根。當我第二次調用printcontents時,它會正確打印新的根值,但當它繼續打印內容並達到該值以前的位置時,它將有一個隨機的長整數「-572 ......」 (雖然我不認爲這個數字很重要),然後我的程序崩潰了。我看到我的根的價值正在被取代,但之後會發生什麼?從二叉搜索樹中刪除

這是我的刪除功能:

void BinarySearchTree::remove(int value) { 

     Node* tmp = head; 
     Node* tmp2 = head; 


    if (head->data == value && head->left != NULL) { 

     tmp=tmp->left; 

     while (tmp->right != NULL) { 
      tmp=tmp->right; 

     } 

     while (tmp2->right->right != NULL) { 
      tmp2=tmp2->right; 

     } 

     if (tmp->left == NULL) {  

     head->data = tmp->data; 
     tmp2->right = NULL; 
     delete tmp; 

     } 

     if (tmp->left != NULL) { 

      head->data = tmp->data; 
      tmp2->right = tmp->left; 
      delete tmp; 

     } 




} 

這顯然是不完整的,但我也測試只能處理其中的根源去除,並且左側由最右邊的值替換的情況下樹(假設有一個左邊,有),並且我覺得它在邏輯上應該是有效的,所以也許是當我「刪除tmp」時出現錯誤。我不知道發佈我的整個程序是否必要,但如果是這樣,請告訴我!

+0

永遠不會被忽視如此糟糕大聲笑 – FrostyStraw

回答

1

我可以建議您不要爲root寫作,您爲什麼不把它視爲在CLRS中處理:這是兩個不同的情況。 1.當要刪除的節點是一個葉子 2.當要刪除的節點是非葉子(在這種情況下,將其替換爲inorder後繼/前任)。

根刪除顯然屬於第二種情況。這只是一個建議。