目錄
紅黑樹(red-black tree)是一種改進的二叉查詢樹,結點域中增加顏色屬性(紅或黑)。
二叉查詢樹的一般操作的時間為 o(lgn)。但若它退化成一棵n個結點的線性鏈後,操作最壞時間為
o(n)。而紅黑樹增加了著色和相關性質保證了查詢、插入、刪除的時間複雜度最壞為 o(lgn).
特徵
每個節點非紅即黑
根結點為黑
葉節點為黑
紅色結點的孩子都為黑色結點
從任意結點到其子樹中每個葉子節點的路徑上包含相同數量的黑色結點
紅黑樹和234樹是一種等價的資料結構n個內結點的紅黑樹的高度最多為2lg(n+1)
黑高度為從某個結點出發(不包括該結點,包含葉子)到達乙個葉結點的任意一 條路徑上,黑色結點的個數,
記為bh(x)。
黑高度為k的紅黑樹,總結點數最多2^(2k+1)-1個,內結點最多2^(2k)-1(滿二叉,紅黑交替)。
內部結點數最少2^k-1(滿二叉,全黑)。
某結點x到其後代結點的所有簡單路徑中,最長路徑最多是最短路徑的2倍。
參考紅黑樹上的search、minimum、maximum、successor、predecessor 可以在 o(logn)內完成。
時間複雜度o(1)
jdk8 treemap右旋源**
/** from clr */
private void rotateright(entryp)
}
主要分兩步:
二叉查詢樹的就是乙個二分查詢,找到合適的位置就放進去。紅黑樹的插入在二叉查詢樹插入的基礎上,為了重新恢復平衡,繼續做了插入修復操作。當我們往紅黑樹中插入乙個黑色節點時,會打破乙個平衡:任一節點到它子樹的每個葉子節點的路徑中都包含同樣數量的黑節點。
當我們給乙個紅色節點下插入乙個紅色節點時,會打破另乙個平衡:紅色節點的左右孩子一定都是黑色節點。
為了簡化調整,我們直接把插入的節點直接染成紅色,這樣就不會影響上乙個平衡,只要專心調整滿足後乙個平衡就好了。染成紅色後,我們只要關心父節點是否為紅,如果是紅的,就要把父節點進行變化,讓父節點變成黑色,或者換乙個黑色節點當父親,這些操作的同時不能影響 不同路徑上的黑色節點數一致的規則。
關注插入節點的父親節點的位置,而父親節點位於其爺爺節點地左子樹或者右子樹的操作是相對稱的,座椅只需要研究一側,即插入位置的父親節點為左子樹。插入、染紅後的調整有 2 種情況:
情況1.父親節點和叔叔節點都是紅色
如上圖所示,假設插入的是節點 n,這時父親節點 p 和叔叔節點 u 都是紅色,爺爺節點 g 一定是黑色。
紅色節點的孩子不能是紅色,這時不管 n 是 p 的左孩子還是右孩子,只要同時把 p 和 u 染成黑色,g 染成紅色即可。這樣這個子樹左右兩邊黑色個數一致,也滿足特徵 4。
但是這樣改變後 g 染成紅色,g 的父親如果是紅色可能又違反特徵 4 了,因此需要以 爺爺節點 g 為新的調整節點,再次進行迴圈調整操作,直到父親節點不是紅的。
情況2.父親節點為紅色,叔叔節點為黑色
如上圖所示,假設插入的是節點 n,這時父親節點 p 是紅色,叔叔節點 u 是黑色,爺爺節點 g 一定是黑色。
紅色節點的孩子不能是紅色,但是直接把父親節點 p 塗成黑色也不行,這條路徑多了個黑色節點。
通過把 爺爺節點 g 右旋,p 變成了這個子樹的根節點,g 變成了 p 的右子樹。
右旋後 g 跑到了右子樹上,這時把 p 變成黑的,多了乙個黑節點,再把 g 變成紅的,就平衡了!
上面講的是插入節點 n 在父親節點 p 的左孩子位置,如果 n 是 p 的右孩子,就需要多進行一次左旋,把情況化解成上述情況,如下圖:
時間複雜度:o(lgn),最多兩次旋轉
刪除o(lgn)最多三次旋轉
查詢o(lgn)
挑選乙個合適的基本資料結構
決定在基本資料結構上增加的資訊
修改基本資料結構上的操作並維持原有的效能
修改或設計新的操作
序統計樹
序統計就是在一系列數中找出最大、最小值,某個數的序值等操作。
結點域增加size(以x為根的子樹所包含的內部結點數,包括x)
操作的時間複雜度o(lgn)
區間樹o(lgn)
《演算法導論》
跟我一起學演算法 紅黑樹
目錄紅黑樹 red black tree 是一種改進的二叉查詢樹,結點域中增加顏色屬性 紅或黑 二叉查詢樹的一般操作的時間為 o lgn 但若它退化成一棵n個結點的線性鏈後,操作最壞時間為 o n 而紅黑樹增加了著色和相關性質保證了查詢 插入 刪除的時間複雜度最壞為 o lgn 特徵 每個節點非紅即...
跟我一起學攝影
咦 好巧!我也是攝影愛好者。咱們一起學習吧。或許你也有這樣的體驗,並茂的文章更能讓人快速進入學習狀態,更何況是攝影,必須有圖。下面是我彙總的資料,必須深入淺出,拒絕一切晦澀難懂。學習課本 1.佳能官網 能系統學習攝影知識,從入門 初級 中級 高階 高階。每個頁面講解乙個知識點,結合實際的拍攝效果,深...
跟我一起學 演算法導論 堆
encoding utf 8 遞迴 單條路 自下往上排序 defheap adjust data,s,m if2 s m return 宣告 預設父節點位置 temp s 1 左 子節點值 大於 父節點值 預設父節點位置 為 左子節點位置 ifdata 2 s 1 data temp temp 2 ...