《演算法》 3 3平衡查詢樹(2)

2021-08-03 23:43:19 字數 1788 閱讀 8778

2-3查詢樹的實現採用紅黑二叉樹的簡單資料結構來表達;

用這樣的資料結構表達,**量不大;

3.3.1.1 紅黑二叉樹表達2-3查詢樹

由一條紅色左鏈結相連的裡那個2-節點表示乙個3-節點;

黑鏈結是2-3樹中的普通鏈結;

沒有任何乙個節點同時和兩條紅鏈結相連;(紅鏈結均為左鏈結)

該樹是完美黑色平衡樹,即任意空連線到根節點的路徑上的黑鏈結數量相同;

node節點中有乙個表示顏色的布林變數color,如果指向該節點的連線是紅色的,則color變數為true,黑色則為false;

只允許紅色左鏈結的存在,可以減少可能出現的情況,減少**量;

3.3.1.5旋轉

當出現紅色右鏈結、出現連續的兩條紅鏈結時,需要對紅鏈結做旋轉操作;

將紅色右鏈結變為紅色左鏈結,成為左旋轉;將紅左鏈結變為紅右鏈結是右旋轉;

普通插入操作要用到旋轉操作;

旋轉不影響樹的有序性、完美平衡性;

3.3.1.7向2-節點下插入新鍵

小於老鍵,直接增加乙個紅鏈結節點;

大於老鍵,增加紅右鏈結,左旋轉;如果老鍵不是根節點則要修正指向老鍵的連線;

3.3.1.9向3-節點下插入新鍵

建立臨時的4-節點,將其分解將(中間值)紅鏈結轉移到父節點,重複這個過程,直到遇到2-節點或根節點;

3.3.1.10顏色轉換

顏色轉換方法flipcolors(),將父節點顏色由黑變紅(表示將該4-節點的中間節點取出加入其父節點),將顏色由紅變黑(左右鏈結分別指向2-節點);

根節點總是黑色(每次插入後都將根節點設定為黑色);

當根節點由紅變黑時黑鏈結高度加1;

3.3.1.13將紅鏈結在樹中向上傳遞

右子節點是紅色左子節點是黑色:左旋轉;

左子節點的是紅色,左子節點的左子節點是紅色:右旋轉;

左右子節點是紅色:顏色轉換;

紅黑樹的插入操作put(),與二叉查詢樹的put()實現,除了遞迴語句的後三條if語句,其他都相同。

如果右子節點是紅色左子節點是黑色:左旋轉;

如果左子節點的是紅色,左子節點的左子節點是紅色:右旋轉;

如果左右子節點是紅色:顏色轉換;

3.3.4.2刪除最小鍵

刪除樹底部的3-節點:直接刪除;

刪除樹底部的2-節點:如果直接刪除,則連線變為空連線,破壞了樹的平衡性;要保證當前節點不是2-節點;操作如下:

1) 如果當前節點左子節點是2-節點,左子節點的親兄節點不是2-節點,將親兄節點中的乙個鍵移入父節點,父節點最小鍵移入左子節點中,(父節點結點型別不變);

2) 如果當前節點左子節點是2-節點,左子節點的親兄節點也是2-節點,將父節點中的最小鍵移入左子節點,將左子節點的最近鄰親兄節點移入左子節點,(左子節點變為4-節點,父節點由3-變為2-,或者由4-變為3-);

3.3.4.3刪除

如果被刪除的鍵不再樹的底部,將它和它的後繼節點交換,和二叉查詢樹一樣。

3.3.5  紅黑樹性質

一棵大小為n的紅黑樹,高度不超過2lgn;

一棵大小為n的紅黑樹,根節點到任意結點的平均路徑長度為~1.00lgn

紅黑樹實現中最複雜的**時插入put()和刪除delete(),查詢最大/小鍵、select()、rank()、floor()、ceiling()和範圍查詢方法,和二叉查詢樹一樣

《演算法》 3 3平衡查詢樹(1)

理想情況下如何保持二叉樹的平衡?這裡引入平衡查詢樹。2 3查詢樹定義 2 節點,含有乙個鍵 及其對應值 和兩條鏈結,左鏈結指向的節點的鍵小於該節點,右鏈結指向的節點的鍵大於該節點 3 節點,含有兩個鍵 及其對應值 和三條鏈結,左鏈結指向的節點的鍵都小於該節點,中鏈結指向的節點的鍵介於節點的兩個鍵之間...

平衡查詢樹

在前面我們說了二叉查詢樹,它在最壞的情況下是很糟糕的。下面我們來說一種查詢樹,這種這查詢樹能夠保證無論如何構造它,它的執行時間都是對數級別的。理想情況下我們希望能夠保持二分查詢樹的平衡性。在一棵含有n個結點的樹中,我們希望樹的高度為lgn,這樣我們就能保證所有查詢能在lgn次比較內結束,就和二分查詢...

演算法5 1 平衡查詢樹之二三樹

平衡查詢樹的目標是實現查詢 插入 刪除操作在最壞情況下的複雜度均為logn。本節將介紹二三查詢樹。二三樹中有兩種節點 二三查詢樹非常平衡,每個空節點到根節點的距離都是一樣的 在二三樹中查詢乙個鍵的時候有以下規則 根據查詢操作的規則,先定位到需要插入的節點。如果是二節點,那麼將二節點中增加乙個鍵成為三...