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。通過對任何一條從根到葉子簡單路徑上的 顏色來約束,紅黑樹保證最長路徑不超過最短路徑的兩倍,因而近似於平衡 由於性質中紅色節點不連續,最短路徑可為全是連續黑結點,最長路徑則由於紅節點不連續,則每間隔乙個...