紅黑樹的左旋和右旋比較費解,網上很多資料說的很複雜,這裡我用望文生義的思維來解釋左旋和右旋。可能對搜尋資料的網友有幫助。
二叉查詢樹是一棵空樹,或者是具有下列性質的二叉樹:
1、若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
2、若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
3、左、右子樹也分別為二叉排序樹;
4、沒有鍵值相等的節點。
什麼是紅黑樹?
紅黑樹(英語:red–black tree)是一種不平衡二叉查詢樹,
無需保證左右子樹高度差小於等於1。
是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。
它在2023年由魯道夫·貝爾發明,被稱為"對稱二叉b樹",
它現代的名字源於leo j.guibas和robertsedgewick於2023年寫的一篇**。
紅黑樹的結構複雜,但它的操作有著良好的最壞情況執行時間,
並且在實踐中高效:它可以在o(logn)時間內完成查詢,插入和刪除,
這裡的n是樹中元素的數目。
紅黑樹是每個節點都帶有顏色屬性的二叉查詢樹,顏色為紅色或黑色。
在二叉查詢樹強制一般要求以外,對於任何有效的紅黑樹我們增加了如下的額外要求:
1、節點是紅色或黑色。
2、根是黑色。
3、所有葉子都是黑色(葉子是nil節點)。
4、每個紅色節點必須有兩個黑色的子節點。(從葉子到根之間不能有兩個連續紅色節點)
5、從任一節點到其每個葉子的所有簡單路徑都包含相同數目的黑色節點。
這些約束確保了紅黑樹的關鍵特性:
從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長。
左旋**(x左邊節點逆時針旋轉):
a
/ \
b x -> x
/ \ / \
c d a d
/ \
b c
如圖以x為中心,其父節點為a,左邊兄弟節點為b,左子節點為c,右子節點為d
左旋就是保證x和右子節點d不變,逆時針旋轉與x節點的直接相關的左邊節點,也就是a,b,c
左旋的過程是將x的父節點a,左邊兄弟節點b 逆時針旋轉,
原來的x左節點c被x的父節點替代,
原來x的左子節點c逆時針方向平移後變成x的原父節點a的右子節點。
右旋**(x右邊節點順時針旋轉):
a
/ \
x b -> x
/ \ / \
d c d a
/ \c b
如圖以x為中心,其父節點為a,右邊兄弟節點為b,左子節點為d,右子節點為c
右旋就是保證x和左子節點d不變,順時針旋轉與x直接相關的右邊節點,也就是a,b,c
右旋的過程是將x的父節點a,右邊兄弟節點b,還有右子節點c順時針旋轉。
原來的x右節點c被x的父節點替代,
原來的x的右子節點c順時針方向平移後變成x的原父節點a的左子節點。
紅黑樹 旋轉
此篇部落格我們討論紅黑樹的旋轉 左旋和右旋 為了更好的理解旋轉,我們只關注紅黑樹中關於二叉查詢樹部分的規則,而不關注紅黑樹中關於本身紅黑樹定義部分的規則。左旋現有紅黑樹結構如下 為了更好的理解,我們給節點x y a b和c乙個值,並把要進行左旋的節點x標為紅色 注意 和紅黑樹的紅色沒關係,僅僅起乙個...
理解紅黑樹
在樹裡面的節點不是紅色的就是黑色的,沒有其他顏色,要不怎麼叫紅黑樹呢,是吧。性質二 根節點是黑色 根節點總是黑色的。它不能為紅。性質三 每個葉節點 nil或空節點 是黑色 這個可能有點理解困難,可以看圖 這個就是乙個紅黑樹,nil節點是個空節點,並且是黑色的。性質四 每個紅色節點的兩個子節點都是黑色...
紅黑樹理解
近期讀 linux核心設計與實現 第三版 清晰中文版 發現linux低層資料結構很多都用到紅黑樹,查查資料說說自己的理解。紅黑樹 二叉樹 高度限制 二叉樹 確定了它的查詢非常快。高度限制 這個是取普通二叉樹和平衡二叉樹之間。普通二叉樹,只管插入不做調整,可能會出現單鏈很長。平衡二叉樹,所有的鏈高度相...