紅黑樹是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡。
紅黑樹是滿足下面紅黑性質的二叉搜尋樹
1. 每個節點,不是紅色就是黑色的
2. 根節點是黑色的
3. 如果乙個節點是紅色的,則它的兩個子節點是黑色的(兩個紅色結點不能相鄰)
4. 對每個節點,從該節點到其所有後代葉節點的簡單路徑上,均包含相同數目的黑色節點
為什麼滿足上面的顏色約束性質,紅黑樹能保證最長路徑不超過最短路徑的兩倍?
假設在極端情況下,最短路徑上的結點全為黑,最長路徑上的黑色結點數與最短路徑上的相同,紅色結點只能夾在黑色結點的中間,最長路徑的長度必然不會超過最短路徑的兩倍。
插入的幾種情況
cur為當前節點,p為父節點,g為祖父節點,u為叔叔節點
第一種情況
cur為紅,p為紅,g為黑,u存在且為紅
則將p,u改為黑,g改為紅,然後把g當成cur,繼續向上調整。
第二種情況
cur為紅,p為紅,g為黑,u不存在/u為黑
p為g的左孩子,cur為p的左孩子,則進行右單旋轉;相反,p為g的右孩子,cur為p的右孩子,則進行左單旋轉
p、g變色–p變黑,g變紅
第三種情況
cur為紅,p為紅,g為黑,u不存在/u為黑
p為g的左孩子,cur為p的右孩子,則針對p做左單旋轉;相反,p為g的右孩子,cur為p的左孩子,則針對p做右單旋轉–>轉換成了情況2
對Git的總結
git 與常用的版本控制工具 cvs subversion 等不同,它採用了分布式版本庫的方式,不必伺服器端軟體支援,使源 的發布和交流極其方便。1.1 git是分布式而非集中式版本控制 乙個集中式的版本控制系統如上圖所示。其特點就是有乙個單一的集中管理的伺服器,儲存所有檔案的修訂版本,而協同工作的...
對指標的總結
指標 pointer 就是記憶體的位址,c語言允許用乙個變數來存放指標,這種變數稱為指標變數。指標變數可以存放基本型別資料的位址,也可以存放陣列 函式以及其他指標變數的位址。程式在執行過程中需要的是資料和指令的位址,變數名 函式名 字串名和陣列名在本質上是一樣的,它們都是位址的助記符 在編寫 的過程...
對Kafka的總結
定位 kafka是一款分布式,高吞吐量,基於發布 訂閱的訊息中介軟體。核心元件 broker kafka伺服器,負責訊息的儲存和 topic 主題,訊息的類別,kafka按照topic分類訊息。partition 分割槽,乙個topic可以有多個partition分割槽,topic中的訊息儲存在各個...