【数据结构与算法】平衡二叉树、红黑树
1.樹、二叉樹
2.二叉查找樹
3.平衡二叉樹、紅黑樹
4.遞歸樹
一,什么是“平衡二叉查找樹”
1,定義:二叉樹中任意一個節點的左右子樹的高度相差不能大于1。
所以:完全二叉樹,滿二叉樹都是平衡二叉樹,非完全二叉樹也有可能是平衡二叉樹。
2,平衡二叉查找樹不僅滿足上面平衡二叉樹的定義,還滿足二叉查找樹的特點。
3,發明平衡二叉查找樹這類數據結構的初衷是解決普通二叉查找樹在頻繁的插入,刪除等動態更新的情況下,出現時間復雜度退化的問題。
所以,平衡二叉查找樹中“平衡”的意思,其實就是讓整棵樹左右看起來比較“對稱”,比較“平衡”,不要出現左子樹很高,右子樹很矮的情況。這樣就能讓整顆樹的高度相對低一些,相應的插入,刪除,查找等操作的效率高一些。
4,若設計一個新的平衡二叉查找樹,只要樹的高度不比log2n大很多(如樹的高度仍然是對數量級的),盡管它不符合嚴格的平衡二叉查找樹的定義,但它仍然可以被認為是一個合格的平衡二叉查找樹。
二,如何定義一棵“紅黑樹”
1,平衡二叉查找樹有很多,如:Splay Tree(伸展樹),Treap(樹堆)等,但是我們提到平衡二叉查找樹,聽到的基本都是紅黑樹。他的出境率甚至要高于“平衡二叉查找樹”這幾個字,甚至在有些時刻,默認平衡二叉查找樹就是紅黑樹
2,紅黑樹:英文“Red-Black-Tree”,簡稱R-B Tree,有如下特性:
它是一種不嚴格的平衡二叉查找樹。
紅黑樹中的節點,一類別標記為黑色,一類被標記為紅色。
- 根節點是黑色的;
- 每個葉子節點都是黑色的空節點(NIL),也就是說,葉子節點不存儲數據;
- 任何相鄰的節點都不能同時為紅色,即紅色節點都是被黑色節點隔開的;
- 每個節點,從該節點到達其可達葉子節點的所有路徑,都包含相同數目的黑色節點;
3,二叉查找樹很多操作的性能都跟樹的高度成正比,一課極其平衡的二叉樹(滿二叉樹或完全二叉樹)的高度大約是log2n,所以要證明紅黑樹是近似平衡的,我們只需要分析,紅黑樹的高度是否比較穩定地趨近log2n就好
。
4,紅黑樹的高度分析
①:首先,若將紅色節點從紅黑樹中去除,那單純包含黑色節點的紅黑樹的高度比包含相同節點個數的完全二叉樹的高度要小。所以去掉紅色節點的“黑樹”的高度也不會超過log2n。
②:在紅黑樹中,紅色節點不能相鄰,即有一個紅色節點就要至少有一個黑色節點,將它更其他紅色節點隔開。
紅黑樹中包含最多黑色節點的路徑不會超過log2n,所以加入紅色節點之后,最長路徑不會超過2log2n,即,紅黑樹的高度近似2log2n
③:紅黑樹的高度只比高度平衡的AVL樹的高度(log2n)僅僅大了一倍,在性能上下降的并不多。
三:工程中大家都喜歡用紅黑樹這種平衡二叉查找樹的原因:
①:Treap,Splay Tree,絕大部分情況下,它們操作的效率都很高,但是也無法避免極端情況下時間復雜度的退化。盡管這種情況出現概率不大,但是對于單次操作時間非常敏感的場景來講,它們不適用。
②:AVL樹是一種高度平衡的二叉樹,所以查找的效率非常高,但是,有利有弊,AVL樹為了維持這種高度平衡,要付出更多代價,每次插入,刪除都要做調整,就比較復雜,耗時。所以有頻繁的插入,刪除操作的數據集合,使用AVL樹的代價就有點高了。
③:紅黑樹只是做到了近似平衡,并不是嚴格的平衡,所以維護平衡的成本上,要比AVL樹低。
所以,紅黑樹的插入,刪除,查找各種操作性能都比較穩定。對于工程應用來說,結果狀態可控可預期。
四、理解紅黑樹源碼
使用遞推思想
暫時無法理解
N、問題
動態數據結構支持動態的數據插入、刪除、查找操作,除了紅黑樹,我們前面還學習過哪些呢?能對比一下各自的優勢、劣勢,以及應用場景嗎?
散列表:插入刪除查找都是O(1), 是最常用的,但其缺點是不能順序遍歷以及擴容縮容的性能損耗。適用于那些不需要順序遍歷,數據更新不那么頻繁的。
跳表:插入刪除查找都是O(logn), 并且能順序遍歷。缺點是空間復雜度O(n)。適用于不那么在意內存空間的,其順序遍歷和區間查找非常方便。
紅黑樹:插入刪除查找都是O(logn), 中序遍歷即是順序遍歷,穩定。缺點是難以實現,去查找不方便。其實跳表更佳,但紅黑樹已經用于很多地方了。
筆記整理來源: 王爭 數據結構與算法之美
總結
以上是生活随笔為你收集整理的【数据结构与算法】平衡二叉树、红黑树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模糊综合评价模型 ——第四部分,多级模糊
- 下一篇: 815. Bus Routes