19. 紅黑樹(上):爲什麼工程中都用紅黑樹這種二叉樹

我們依次講了樹、二叉樹、二叉查找樹。二叉查找樹是最常用的一種二叉樹,它支持快速插入、刪除、查找操作,各個操作的時間複雜度跟樹的高度成正比,理想情況下,時間複雜度是O(logn)。

不過,二叉查找樹在頻繁的動態更新過程中,可能會出現樹的高度遠大於log2n的情況,從而導致各個操作的效率下降。極端情況下,二叉樹會退化爲鏈表,時間複雜度會退化到O(n)。我上一節說了,要解決這個複雜度退化的問題,我們需要設計一種平衡二叉查找樹,也就是今天要講的這種數據結構。

什麼是“平衡二叉查找樹”?

平衡二叉樹的嚴格定義是這樣的:二叉樹中任意一個節點的左右子樹的高度相差不能大於1。從這個定義來看,上一節我們講的完全二叉樹、滿二叉樹其實都是平衡二叉樹,但是非完全二叉樹也有可能是平衡二叉樹。

發明平衡二叉查找樹這類數據結構的初衷是,解決普通二叉查找樹在頻繁的插入、刪除等動態更新的情況下,出現時間複雜度退化的問題。

所以,平衡二叉查找樹中“平衡”的意思,其實就是讓整棵樹左右看起來比較“對稱”、比較“平衡”,不要出現左子樹很高、右子樹很矮的情況。這樣就能讓整棵樹的高度相對來說低一些,相應的插入、刪除、查找等操作的效率高一些。

所以,如果我們現在設計一個新的平衡二叉查找樹,只要樹的高度不比log2n大很多(比如樹的高度仍然是對數量級的),儘管它不符合我們前面講的嚴格的平衡二叉查找樹的定義,但我們仍然可以說,這是一個合格的平衡二叉查找樹。

如何定義一棵“紅黑樹”?

紅黑樹中的節點,一類被標記爲黑色,一類被標記爲紅色。除此之外,一棵紅黑樹還需要滿足這樣幾個要求:

  • 根節點是黑色的;

  • 每個葉子節點都是黑色的空節點(NIL),也就是說,葉子節點不存儲數據;

  • 任何相鄰的節點都不能同時爲紅色,也就是說,紅色節點是被黑色節點隔開的;

  • 每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點;

紅黑樹是一種平衡二叉查找樹。它是爲了解決普通二叉查找樹在數據更新的過程中,複雜度退化的問題而產生的。紅黑樹的高度近似log2n,所以它是近似平衡,插入、刪除、查找操作的時間複雜度都是O(logn)。

因爲紅黑樹是一種性能非常穩定的二叉查找樹,所以,在工程中,但凡是用到動態插入、刪除、查找數據的場景,都可以用到它。不過,它實現起來比較複雜,如果自己寫代碼實現,難度會有些高,這個時候,我們其實更傾向用跳錶來替代它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章