查詢很簡單,跟二叉查詢樹是類似的,以上圖為例,查詢8的話,首先跟根節點13比較,8小於小於13,於是去左子樹中查詢,8又大於6而小於9於是去這個結點的中子樹中查詢,命中。
插入是非常重要的一步,正是在插入上邊體現了2-3樹的自下向上生長,保持了樹的平衡。也因此,插入要複雜一點點,我們分情況討論:
2-3樹作為一種概念,而紅黑樹便是它的實現。2-3樹為了保持樹的平衡性出現了三種結點,而紅黑樹中只有一種結點,看起來就是普通的二叉查詢樹。只不過通過對紅黑結點進行變色,旋轉來使得每乙個紅黑樹都可以有乙個與之對應的2-3樹,從而擁有2-3樹的性質。總之,紅黑樹的基本思想就是用標準的二叉查詢樹來表示2-3樹,這樣我們不需要定義各種不同的結點,只需要給每個結點增加顏色的屬性以及旋轉變色的動作就可以實現一種高效的二叉查詢樹。如圖2-3樹和與之對應的紅黑樹:
將紅線拉平是為了更清楚的看出二者的對應關係,其實紅黑樹就是乙個有顏色的二叉樹,將拉平的紅線還原:
顏色紅黑樹中的結點有兩種顏色,紅色和黑色。由紅色鏈結指向的結點是紅結點,黑色鏈結指向的結點是黑結點。結點了有了顏色之分,為什麼鏈結也有顏色呢?著實還是為了模擬2-3樹,2-3樹中的3-結點就是通過紅色鏈結在紅黑樹中實現的。由紅色鏈結連起來的兩個2-結點,構成乙個3-結點。
旋轉為了減少可能出現的情況,我們只允許出現紅色左鏈結,而不允許紅色右鏈結以及連續紅色鏈結的出現。但是當我們進行某些操作之後,這兩種我們不允許的狀況就會出現,我們就需要進行旋轉操作。
左旋轉紅連線,6和9的結點顏色發生變化,>6&&<9這個子樹的父結點發生變化,從而紅色右鏈結轉換為紅色左鏈結。
顏色變換
如果出現如圖情況就需要進行顏色變換,將自己的兩個紅色鏈結變為黑色鏈結,並將自己由黑變紅也就是將指向自己的鏈結由黑變紅。
查詢紅黑樹的查詢就是二叉查詢樹中的查詢,完全類似。
插入為了保證樹的平衡,總是用紅色的鏈結指向新增的結點,對應到2-3樹裡邊就是總是在結點內部新加鍵而不是新增乙個結點。
紅黑樹是第一種能夠同時實現高效的查詢、插入和刪除操作的資料結構。今天我們介紹了最簡單易懂的部分,並且規定了不准出現右紅色鏈結,也就是對應的2-3樹中不會出現4-結點,而現實中這種情況是可以存在的,只不過**實現要更複雜一些。還有紅黑樹的刪除,以及每種操作的**實現,都留給未來的那篇文吧。
初識紅黑樹
紅黑樹的五個基本特性 1.每個節點要麼是紅的,要麼就是黑的 2.根節點一定是黑的 3.每個葉子節點一定是黑的,就是 nil 4.如果乙個雙親節點是紅的,那麼他的子節點一定是黑的 5.對每個節點,從該節點到其子孫節點的所有路徑上包含相同數目的黑節點 紅黑樹的插入和刪除操作會違背紅黑樹的原有性質,為了避...
無聊的木頭 初識set(紅黑樹)
c 有著豐富的函式以及各種容器,這極大的精簡的 在看火影第二部的時候,我們都知道,為了節省查克拉的使用,進而產生了一種容器,容器裡面裝有特定的技能,只要我們發射容器,就會產生和本身技能同樣的效果,這不僅節省了查克拉的使用,而且操作簡單,每個人都可以使用 c set容器有著異曲同工之妙 set容器封裝...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...