紅黑樹

前置知識:算法

1, BST(二叉搜索樹)數據結構

定義:BST的中序遍歷序列是一串單調序列,通常是升序序列spa

插入值e:順着樹向下查找,直到null,建立值爲e的節點替代null指針

刪除值e:查找到e,而後選擇直接後繼,先右而後左到底(升序),易證該節點爲直接後繼。找到直接後繼以後,將e與直接後繼交換位置,再刪除e。io

直接後繼節點的特徵:沒有左孩子。二叉樹

2,AVL樹(平衡二叉樹)搜索

定義:在二叉搜索樹的前提下知足以下條件,設僅一個節點的樹高度爲0,路徑上每有一條邊,高度加1。某節點高度等於該節點最長路徑的邊數;平衡條件,左右子樹高度之差小於等於1,即h左-h右能夠爲 1,0,-1;遍歷

查找:方法

順着樹向下,很容易。數據

插入算法:

第一步:利用BST的搜索算法搜索到插入位置——必爲某個葉節點的左右孩子:NULL(既然能夠插入,必然搜索失敗,而失敗的查找指針必然落到葉節點的左右孩子:NULL上)

第二步:尋找三個節點x,y,z的位置關係。如何肯定x,y,z?首先要知道,插入某個節點e可能會改變哪些節點的高度——答案是從e到根節點這條路徑上L的全部節點的高度。首先肯定x,x爲路徑L上,從e開始逆向到根節點的第一個由於插入e致使高度不平衡的節點;其次肯定y,對比x的左右孩子,更高的設置爲y;最後肯定z,對比y的左右孩子,更高的設置爲z(若高度相同,取左仍是右取決於y爲左孩子仍是右孩子)。肯定好x,y,z後,來判斷他們的位置關係。關係A:順着x到z的路徑畫線,路徑不轉彎(狀況m:y爲x的左孩子,z爲y的左孩子;狀況n:y爲x的右孩子,z爲y的右孩子) 關係B:路徑轉彎。

第三步:對於關係A:在x,y之間作一次左順右逆旋轉。對於關係B,依照狀況在y,z之間作一次旋轉,將其轉化爲關係A,再作左順右逆旋轉。

左順右逆旋轉:狀況m作順時針,狀況n作逆時針。說白了就是將一個三個節點構成的斜坡轉換爲一個波浪的形狀。這樣能夠恢復平衡。

刪除算法:

找x,y,z節點的方法與插入算法一致。旋轉也大同小異,不過注意存在失衡傳播:照片不拍了很麻煩,參見鄧俊輝數據結構——AVL樹。

3,B-樹

存在理由:爲了減小io操做的次數,將多個節點合併爲一個大節點,就高度而言,b樹全部節點左右子樹高度相同。

定義:先取向上取整符號爲↑,向下取整符號爲↓。設最大分支數m。

a:B樹最大分支數爲m,最小分支數爲↑m/2。(關鍵碼數等於分支數減一)根節點除外,根節點分支數>=2,<=↑m/2;

b:B樹全部葉節點具備相同的深度。

節點的數據結構:由兩組序列,即關鍵碼序列和分支序列構成。

插入操做:

先搜索到應該插入的大節點,再利用向量的search操做找到插入位置。必然是在最底部的大節點中插入。

成功插入後可能會遇到上溢的狀況:分支數大於m

處理上溢:

選取↓m/2做爲分割點,將關鍵碼分爲左右兩部分,將↓m/2處的點提高至父節點。

刪除操做:

與BST相似,應該先替換,再刪除。

成功刪除後可能會遇到下溢狀況:分支數小於↑m/2

兩種解決辦法:

1,兄弟節點B有多餘:設下溢節點爲A,向兄弟節點B借出一個關鍵碼到父節點,父節點該處的關鍵碼下移到A節點相應位置。

2,兄弟節點B沒有多餘:向父節點借出一個關鍵碼,將A,B粘接起來。

 

紅黑樹:

10號前更新

相關文章
相關標籤/搜索