簡體   English   中英

C ++刪除節點二進制搜索樹

[英]C++ remove node binary search tree

我試圖弄清楚如何從二叉搜索樹中刪除一個節點,我知道每個節點是葉子,有一個孩子還是兩個孩子對於每個節點都是不同的。 因此,到目前為止,我的功能只不過是:


bool BinSTree::remove_root(treeNode*& node) {
   if(node -> left == NULL && node -> right == NULL) {


   }
   elseif(node -> left != NULL && node -> right != NULL) {


   }  
   else {

   }                           

}

我很難理解邏輯,例如,我知道對於所有邏輯我都需要能夠找到要刪除的節點的父節點,這對我來說是毫無頭緒的,任何幫助都會很大感謝!

這聽起來像作業。 您可能會發現有關二叉樹旋轉的本文很有幫助 除了為您提供一些有關如何處理一些有趣案例的提示外,該文章還將向您展示如何自行解決問題。

從樹中刪除是一個有趣的情況,我記得在80年代末用C編寫自己的AVL樹實現時對此感到困惑。

首先,您的函數也應該為父級添加一個參數(除非您的樹有指向父級的指針,聽起來好像沒有)。

有了這一更改,您應該更容易理解其余的內容。 但是如何調用該函數就變得很重要。

注意 :我假設這是家庭作業,所以我不想提供全面的答案。

另外,關於刪除節點后如何處理節點(如何重新鏈接它們)的邏輯,請嘗試繪制一些圖。

二進制搜索樹上的此Wiki頁面可能會有所幫助。

除了其他答案(並假設這是家庭作業,要學習的重點)之外,您可能會發現Niklaus Wirth的“算法+數據結構=程序”很有啟發性,無論是針對一般問題還是針對您的特定問題。

這是一本經典的小書,一本寶石。

希望可以在離您最近的(大學嗎?)圖書館使用?

干杯,……

刪除節點時,
-如果是一片葉子,就完成了。
-如果有一個孩子,則將其升級,然后從其子樹中刪除該孩子(通過稱呼自己)。
-如果有兩個孩子,請選擇要升級的孩子,然后從其子樹中刪除該孩子(稱呼自己)。

有時候,您選擇兩個孩子中的哪個取決於以下因素
-子樹的根是該子樹中所有節點中最少的一個
-子樹的根是該子樹中所有節點中最多的
-必須保留一些顏色或其他副作用

這應該使您脫穎而出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM