[英]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.