先看幾個基本概念:
樹:由根出發,指向n個孩子,孩子再指向孫子。。。這樣一種資料結構
二叉樹:每個接點最多有兩個孩子的樹
二叉查詢樹:每個結點的左子樹《結點《右子樹
平衡二叉樹:每個結點左右子樹的高度差不大於1
紅黑樹:從任一節點到其每個葉子的所有簡單路徑 都包含相同數目的黑色節點。(當然還有其它性質)
幾點關鍵點:
1.平衡二叉樹/紅黑樹都屬於二叉查詢樹,即滿足左小右大的特性,但同時有增加了一些新的特性,提高了操作效能
2.二叉查詢樹的結點刪除:如果該結點左右子樹都不為空,比較麻煩,需要用該結點的後繼填充到該位置,同時把該後繼在其原來位置上刪除(後繼為中序遍歷結果的下乙個)
3.二叉樹的左旋/右旋:對於平衡二叉樹來說,其插入/刪除結點可能導致樹不平衡,這樣就需要在操作之後對插入點附近進行再平衡操作,使用左旋/右旋即可再平衡 (
1)ll型平衡旋轉法
由於在a
的左孩子
b的左子樹上插入結點f,使
a的平衡因子由1增至
2而失去平衡。故需進行一次順時針旋轉操作。即將a
的左孩子
b向右上旋轉代替
a作為根結點,
a向右下旋轉成為
b的右子樹的根結點。而原來
b的右子樹則變成
a的左子樹。
2)rr型平衡旋轉法
由於在a
的右孩子
c 的右子樹上插入結點f,使
a的平衡因子由
-1減至
-2而失去平衡。故需進行一次逆時針旋轉操作。即將
a的右孩子
c向左上旋轉代替
a作為根結點,
a向左下旋轉成為
c的左子樹的根結點。而原來
c的左子樹則變成
a的右子樹。
二叉查詢樹 平衡二叉樹 紅黑樹
平衡二叉樹 首先是一棵二叉查詢樹。帶有平衡條件 每個結點的左右子樹的高度之差的絕對值 平衡因子 最多為1。紅黑樹 雖然本質上是一棵二叉查詢樹,但它在二叉查詢樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查詢 插入 刪除的時間複雜度最壞為o log n 還具體下列的特性 節點是...
平衡二叉樹 紅黑樹
顏色調整,第一種情況uncle存在且為紅色,第二種和第三種情況,uncle不存在 uncle存在且為黑色,先處理第三種情況,針對parent進行左單旋。test.cpp include using namespace std enum colour template struct rbtreenod...
紅黑樹與平衡二叉樹
性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3.每個葉子節點都是黑色的空節點 nil節點 性質4 每個紅色節點的兩個子節點都是黑色。從每個葉子到根的所有路徑上不能有兩個連續的紅色節點 性質5.從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。這些約束強制了紅黑樹的關鍵性質 從根到葉子...