STL SGI STL紅黑樹實現的邊界條件

2021-08-26 20:29:38 字數 1577 閱讀 8797

sgi stl紅黑樹實現上的特殊點,在於紅黑樹有乙個header輔助節點;

- 該header的父節點為root節點;

- 其左節點為當前二叉樹中的最小值(最左);

- 其右節點為當前二叉樹中的最大值(最右);

- 該節點本身就正好用來當做end迭代器;

其初始化**如下:

void init()
由於header輔助節點的存在,當我們使用迭代器進行「前進」、「後退」的操作時,我們需要考慮一些邊界條件;

以前進為例,既然是前進,要考慮的邊界無非兩種:

基於上述兩點考慮,我們可以寫出如下的初步**:

void increment() 

// 函式入口處的判斷條件,保證了此處必然可以找到對應的正常節點(非header);

if (node->right != nullptr) else

node =

parent;

}}

稍微細看,我們就可以發現條件 if (node->right != nullptr) 本身就保證了,其必然可以從右子樹中找到下乙個正常節點;

因此,我們試著把邊界處理放到else這個分支中;根據最後乙個節點所在的位置,我們可以分兩種情況進行考慮:

1. 最後乙個節點在根節點的右側;

2. 最後乙個節點在根節點;

針對邊界條件1, else分支中的**:

當執行到 (node指向root,parent指向header時),parent->right != node,迴圈終止,node = parent符合預期效果;

針對邊界條件2, else分支中的**:

node指向root,parent指向header時, parent->right == node,因此node = parent(header), parent = parent->parent(root),二者交換位置;此時,node已經指向了header,無需額外賦值操作;

綜上 ,我們需要乙個判斷條件,來決定是否執行node = parent 這個賦值操作;

另外,需要補充的一點就是,除了我們剛剛考慮的上述兩種邊界條件之外,正常情況下都是要node = parent賦值的;

因此,我們的判斷條件,應該從邊界條件2本身的特點出發,進行思考;

因此,我們寫出如下的判斷條件: if (header->right != root)

void increment()  else 

if (header

->right != root) // todo: sgi stl原始碼中是node->right != y 是否完全等價呢?

node =

parent;

}}

類似地,我們對decrement進行分析,「後退」存在的特殊情況就是:迭代器已經指向了end位置;

// 同理,針對first為止,使用decrement應該是未定義行為;

void decrement()  else 

node =

parent;

}}

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...

紅黑樹下 紅黑樹的實現

1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...

紅黑樹實現

紅黑樹 是一棵二叉搜尋樹,它在每個節點上增加了乙個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...