1. 程式人生 > >數據結構與算法-紅黑樹

數據結構與算法-紅黑樹

數據結構 插入 搜索 節點 二叉排序樹 破壞 最長路徑 成了 art

前言

紅黑樹是工程中最常用到的一種自平衡二叉排序樹,其和AVL樹類似,都是在進行插入、刪除時通過一定的調整操作來維持相對穩定的樹高,從而獲得較好的查詢性能。

性質

1. 節點是紅色或黑色。

2. 根節點是黑色。

3 每個葉節點(null節點)是黑色的。

4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

5. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點

維護紅黑樹形狀(樹高)的,主要就是4、5兩條性質,性質4決定了最長的路徑莫過於紅黑間隔的路徑,性質5決定了最短的路徑莫過於全黑路徑,並且每條路徑上的黑色節點數都相同(相當關鍵),二者共同決定了最長路徑最多是最短路徑的2倍。

插入操作

插入的節點,應當是紅色的,因為在葉節點插入紅色節點不會違反性質5,而性質5恰恰是最難維護的。紅黑樹在插入操作後,需要維護性質2、4、5。

情況1:插入的是根節點。

原樹是空樹,此情況只會違反性質2,直接把此節點反轉為黑色即可。

情況2:插入的節點的父節點是黑色。

此不會違反性質2和性質4,紅黑樹沒有被破壞,什麽也不做。

情況3:插入節點的父節點是紅色且叔叔節點是紅色。

這種情況違反了性質4(新插入節點與父節點構成了連續的兩個紅節點),由於父節點與叔叔節點同為紅色,故可將二者同置為黑色(此時違反了性質5),並將祖父節點置為紅色(之前祖父節點一定為黑色)(遵守了性質5)。

N為插入節點

調整前
技術分享

調整後

技術分享

情況4:當前節點的父節點是紅色,叔叔節點是黑色,當前節點是其父節點的右子節點。

這種情況是最不好解決的,因為不管如何也無法通過一次變色或一次旋轉完成調整,這種情況通常會與情況5結合使用,首先以插入節點的父節點為軸左旋。

調整前

技術分享

調整後

技術分享

情況5:當前節點的父節點是紅色,叔叔節點是黑色,當前節點是其父節點的左子節點。
接情況4,將插入節點的父節點置黑、祖父節點置紅,以祖父節點為軸右旋。

調整前

技術分享

調整後

技術分享

總結

紅黑樹並不追求“完全平衡”——它只要求達到一種相對平衡(而AVL對平衡的要求就很嚴格,為之做出的努力也越多),降低了對旋轉的要求,從而提高了性能。紅黑樹能夠以O(log2 n) 的時間復雜度進行搜索、插入、刪除操作。此外,由於它的設計,任何不平衡都會在三次旋轉之內解決

。當然,還有一些更好的,但實現起來更復雜的數據結構,能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。

參考:http://www.imooc.com/article/11715

  https://www.ibm.com/developerworks/cn/java/j-lo-tree/index.html

數據結構與算法-紅黑樹