當從二叉搜索樹中洗掉一個節點時,要么用左邊最大的子節點替換節點,要么用右邊的最小子節點替換節點。
我很難理解以下
您呼叫remove橙色節點:
self是橙色的。replacement是右子樹的最小值 - 藍色節點。
你通過呼叫removeblue 來遞回:
self是藍色的replacement為 nil,因為blue既沒有左孩子也沒有右孩子- 你打電話(或者更確切地說你不打電話,因為?
remove)nil - 同樣,所有其他分配都被跳過,因為可選值都是
nil reconnectParent(node: nil)被呼叫來修復 blue 父級的左/右鏈接(這將導致green.left被分配nil)- 你回傳藍色
樹現在看起來像:

您現在在最初的呼叫中退出remove并繼續執行。記住,
self是橙色的。replacement是藍色節點。
接下來的步驟是:
blue.right = orange.rightblue.left = orange.leftorange.right.parent = blueorange.left.parent = blueorange.reconnectParentTo(node:blue)- 這沒有任何作用,因為orange沒有父母orange.parent = nilorange.right = nilorange.left = nil- Return from
remove- 這是對 的初始呼叫remove,因此我們退出了所有遞回
這給我們留下了最后一棵樹:

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470925.html
下一篇:從字串陣列遞回創建二叉決議樹
