網上關于平衡二叉樹的文章大多是擺幾張圖,然后就開始貼代碼,很多具體的細節都沒有說清楚,需要讀者去試錯。本篇文章試圖說明這些細節,希望讀者看了這篇文章之后,就能立馬實現出來。
只說插入的情況,刪除的情況和插入差不多,旋轉的四個情況了解清楚了都好說。
Tree_Rebalancing.png
圖片來自維基百科,作為參考講解起來比較方便。
- 左左情況
注意,此時的左左情況是基于自下而上(從插入的新葉子節點往上查找)的第一個不平衡的節點。這個基準點很重要,所有的操作都與這個點有關,反而新插入的葉子節點不一定需要參與旋轉。
圖中的root節點就是基準點。
如果root的左子樹pivot存在,并且pivot的左子樹也存在,則滿足左左情況,進行一次右旋操作,即可平衡。
旋轉實施起來比較簡單,此文不再贅述。 - 右右情況
圖中的root節點就是基準點(同上)。
如果root的右子樹pivot存在,并且pivot的右子樹也存在,則滿足右右情況,進行一次左旋操作,即可平衡。 - 左右情況
注意,此時的圖有誤導的可能,基準點不再是root節點,因為root節點是平衡的。
現在的基準點是root節點的父節點,我們暫且稱它為parent節點。
如果parent的左子樹root存在,并且root的右子樹也存在,則滿足左右情況,先進行一次左旋操作,變成第一種情況。基準點始終不變,再按第一種情況進行一次右旋操作,即可平衡。 - 右左情況
跟第三種情況類似,root節點的父節點parent為基準點。
如果parent的右子樹root存在,并且root的左子樹也存在,則滿足右左情況,先進行一次右旋操作,變成第二種情況。基準點始終不變,再按第二種情況進行一次左旋操作,即可平衡。
另外,給大家推薦一個可視化的工具,叫visualgo。
https://visualgo.net/zh/bst
如果具體怎么旋轉的不好想出來和畫出來,可以參考這個工具。每個值的插入都會以動畫的形式呈現出來,右下角還有偽代碼解釋每一步操作,理解起來會很有幫助。