1. 程式人生 > >紅黑樹,並非想象中的那麼複雜

紅黑樹,並非想象中的那麼複雜

紅黑樹是非常popular的一種self-adjusted的平衡二叉排序樹。

通常他給我們的印象是很複雜,有很多case,要小心的旋轉。有人說,曾將在某公司的面試時,被要求實現紅黑樹。他覺得這很沒有道理,幾乎很少有人能在不參考教科書的情況下,記清楚那麼多的case。

在這一章裡,我將向你展示目前我所見過的最簡潔的紅黑樹實現。簡潔到什麼程度呢?我打賭你看過後能輕鬆通過上面的面試——Wow, 紅黑樹原來可以這麼簡單!

這個實現,來自Chris Okasaki在卡耐基梅隆大學(CMU)的博士研究成果。他啟發我用同樣的方法簡潔地實現了AVL tree和Splay tree。

這一章我們講紅黑樹,大致內容如下:
1. 簡介——我們看看普通的排序二叉樹致命弱點,並且給出樹旋轉的概念;
2. 紅黑樹的定義——我們看看為什麼紅黑樹的性質能解決平衡問題,從而勝過排序二叉樹;
3. 插入——我們給出紅黑樹插入演算法的數學定義,這裡是本章的精華;
4. 刪除——刪除本來不是個問題,但是我們要展示下刪除比起插入有多複雜;
6. 傳統實現——我們看看傳統實現的紅黑樹插入演算法有多複雜,並做進一步的比較分析;傳統實現的刪除演算法我們留作練習。
7. 其他——多說兩句

全文在
https://sites.google.com/site/algoxy/rbtree

附件是PDF版。

全部原始碼在github可以獲得:
https://github.com/liuxinyu95/AlgoXY

相關推薦

並非想象那麼複雜

紅黑樹是非常popular的一種self-adjusted的平衡二叉排序樹。通常他給我們的印象是很複雜,有很多case,要小心的旋轉。有人說,曾將在某公司的面試時,被要求實現紅黑樹。他覺得這很沒有道理,幾乎很少有人能在不參考教科書的情況下,記清楚那麼多的case。在這一章裡,

AVLBB+Trie都分別應用在哪些現實場景

在大型檔案系統中,採用索引可以有效的提高查詢的效率,建立檔案時,在輸入資料記錄的同時,建立一張索引表,每個索引表項記錄相應資料塊的地址。檢索檔案記錄時,先將外存上的索引表讀入記憶體,從索引表中查到資料記錄的地址後,再將相應的記錄讀入記憶體。 如果檔案中的資料在使用過程中記錄變化較多,則要頻繁地對索引表進行插

關聯容器set的用法(關聯容器

ise 特定 using iter tor pre .com main com set和multiset會根據特定的排序準則自動將元素排序,set中元素不允許重復,multiset可以重復。// 2017/7/23號 好像set容器裏面只能裝一個元素#include<

關聯容器map(key/value)

數值 logs items image 劃線 tor tar 參數 cde 字符串或串(String)是由數字、字母、下劃線組成的一串字符。一般記為 s=“a1a2···an”(n>=0)。它是編程語言中表示文本的數據類型。在程序設計中,字符

二叉平衡二叉B-、B+、B*的區別

二叉查詢/搜尋/排序樹  BST  (binary search/sort tree) 或者是一棵空樹; 或者是具有下列性質的二叉樹: (1)若它的左子樹不空,則左子樹上所有結點的值均小於它的根節點的值; (2)若它的右子樹上所有結點的值均大於它的根節點的值; (3)它的左、右子

B數B+實戰應用原理

轉發自頭條號:Java全棧技術 作者:channingbreeze 網際網路偵察 小史是一個應屆生,雖然學的是電子專業,但是自己業餘時間看了很多網際網路與程式設計方面的書,一心想進BAT網際網路公司。

大名鼎鼎的你get了麼?2-3 絕對平衡 右旋轉 左旋轉 顏色反轉

  前言   11.1新的一月加油!這個購物狂歡的季節,一看,已囊中羞澀!趕緊來惡補一下紅黑樹和2-3樹吧!紅黑樹真的算是大名鼎鼎了吧?即使你不瞭解它,但一定聽過吧?下面跟隨我來揭開神祕的面紗吧!   一、2-3樹   1、搶了紅黑樹的光環?   今天的主角是紅黑樹,是無疑的,主角光環在呢!那2-3樹

【BZOJ3227】打表找規律/DP

傳送門 思路: 很有意思的一道題 DP思路十分顯然,我們以最小值為例 f[x][h][0/1]表示節點數為x的子樹,該樹的黑高度為h,根節點顏色為紅/黑時 f[x][h][0]=min{f[y][h][1]+f[x−y−1][h][1]}+1 f[x][

二叉完全二叉滿二叉二叉排序平衡二叉B數B-B+B*(一)

二叉樹 二叉樹:二叉樹是每個節點最多有兩個子樹的樹結構; 是n(n>=0)個結點的有限集合,它或者是空樹(n=0),或者是由一個根結點及兩顆互不相交的、分別稱為左子樹和右子樹的二叉樹所組成。 完全二叉樹 完全二叉樹:除最後一層外,每一層上的結點數均達到最

二叉完全二叉滿二叉二叉排序平衡二叉B數B-B+B*(二)

二叉樹,完全二叉樹,滿二叉樹,二叉排序樹,平衡二叉樹,紅黑樹,B數,B-樹,B+樹,B*樹(一): BST樹 即二叉搜尋樹:        1.所有非葉子結點至多擁有兩個兒子(Left和Right);        2.所有結點儲存一個關鍵字;       

AVLB-B+Trie原理和應用

前言:本文章來源於我在知乎上回答的一個問題 AVL樹,紅黑樹,B樹,B+樹,Trie樹都分別應用在哪些現實場景中? 看完後您可能會了解到這些資料結構大致的原理及為什麼用在這些場景,文章

二叉查詢BST和果然。。。

學習、長進、總結 二叉查詢樹Binary Search Tree。 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值; (2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;

二叉查詢AVLB~/B+(B-tree)伸展——優缺點及比較

二叉查詢樹(Binary Search Tree) 很顯然,二叉查詢樹的發現完全是因為靜態查詢結構在動態插入,刪除結點所表現出來的無能為力(需要付出極大的代價)。 BST 的操作代價分析:     (1) 查詢代價: 任何一個數據的查詢過程都需要從根結點出發,沿

BB+B- 理解

紅黑樹rbtree 二叉排序樹map 就是採用紅黑樹儲存的,紅黑樹(RB Tree)是平衡二叉樹,其優點就是樹到葉子節點深度一致,查詢的效率也就一樣,為logN.在實行查詢,插入,刪除的效率都一致,而當是全部靜態資料時,沒有太多優勢,可能採用hash表各合適。h

BST,AVL,BB+B*(從map的底層實現到mysql索引原理)

本文不會對具體細節過多的探究,力求得到這幾種樹的聯絡以及區別,實際運用。 BST(二叉檢索樹): 二叉檢索樹也是我們最熟悉的一個索引方式了,它保證所有節點的左子樹都小於該節點,所有節點的右子樹都大於該節點。就可以通過大小比較關係來進行快速的檢索,在一棵滿二叉

AVLB與B+

AVL樹 最先發明的自平衡二叉查詢樹,也被稱為高度平衡樹。相比於”二叉查詢樹”,它的特點是:AVL樹中任何節點的兩個子樹的高度最大差別為1。 AVL樹的查詢、插入和刪除在平均和最壞情況下都是O(logn)。 在AVL樹中進行插入或刪除節點後,可能導

真正理解真正的(Linux核心裡大量用到的資料結構且常被二貨問到)

作為一種資料結構,紅黑樹可謂不算樸素,因為各種宣傳讓它過於神祕,網上搜羅了一大堆的關於紅黑樹的文章,不外乎千篇一律,介紹概念,分析效能,貼上程式碼,然後給上罪惡的一句話,它最壞情況怎麼怎麼地...              我們想,一棵二叉樹怎麼就是最壞情況,那就是它退化為一

hash表radix_tree,B+比較

如題,這幾種資料結構都是我們平時常用的資料結構。 hash連結串列: 本質上就是 陣列 + 連結串列 hash樹: 本質上就是 陣列 + 樹。這個樹可以是紅黑樹,B+樹,radix_tree等 因為每種資料結構都有自己的優點,缺點。hash連結串列的各種效能介於 陣列和連

二叉B-B+LSMAVL

二叉樹的概念 在計算機領域,二叉樹是每個節點最多有兩個子樹的結構。通常子樹被稱為左子樹和右子樹。 二叉樹的特例: 滿二叉樹 滿二叉樹是完全二叉樹的特例。 所有葉節點必須在同一層上 除了葉子節點的所有節點都有兩個子節點 完全二叉樹 完全二叉樹可以看成是滿二叉樹

超強動靜圖詳解簡單易懂

寫在前面 紅黑樹,對很多童鞋來說,是既熟悉又陌生。學校中學過,只瞭解大概;工作中不怎麼使用,但面試又是重點。每次需要檢視紅黑樹內容時都很難以更生動形象的方式來理解其內容。沒錯,本文內容就是要解決這個問題,用簡單的語言,搭配靜圖和動圖(利用大腦圖形記憶方式),讓你對紅黑樹有更深入的瞭解和更清晰的記憶,希望小夥伴