我們經常使用著我們並不熟悉的函式/類,我們只知道它們所提供的介面以及怎樣使用。這就像我們開車在馬路上,你可能並不知道汽車是如何執行,或許你會說這並不需要知道。但至少知道一些回在車拋錨的時候你能做一些事,而不是抽根菸無所事事等維修隊過來(如果路上很擠,你就倒霉了)。
我們也有必要知道問題**在程式出問題的時侯。
你可能會說你沒用過樹的迭代器,因為資料庫裡沒有提供樹。但是你如果理解map,set的話,它們的底層實現
就是紅黑樹。它們所使用的迭代器便是紅黑樹的迭代器。
//rep_type便是紅黑樹型別。
typedef
typename rep_type::iterator iterator;
實現二叉樹的迭代器主要是為了方便我們遍歷,以及進行元素修改。使容器可以更好的配合泛型演算法。為此二叉樹的迭代器至少應該支援遞增,遞減,!=, -> 等操作符。
我們有2種辦法來實現二叉樹的迭代器,第一種就是在節點裡遍歷,第二種是線索化二叉樹,
第一種思路:
為了使輸出的元素有序,我們預設的都是中序遍歷,那麼這個樹的最左元素就是begin了.
!=。->運算子都很好實現,主要是遞增遞減我們需要把它的情況都列舉出來。
以下情況都不考慮節點為根節點時的情況。
首先是遞增(++)
1,當前節點無右子節點時
如果當前節點是父節點的左子節點時,那麼父節點便是它的下乙個節點。
如果為父節點的右子節點,那麼便往上查詢,直到不為父節點的右子節點,這時父節點便為下乙個節點。
2,當前節點有右節點時。找出右子樹的最左節點即可。
遞減(— —)
1,當前節點無左節點時
當前節點為父節點的右節點時,父節點即為下乙個節點。
當前節點為父節點的左節點時,向上查詢,直到節點不為父節點的左子節點,這時父節點既是。
2,當前節點有左節點時,找到左子樹的最右節點。
我們這裡以stl中紅黑樹的迭代器為例。stl紅黑樹設定了乙個特殊節點。
//以下列舉的都是stl原始碼,這裡只列舉有關係的**
self
& operator++()
self operator++(int)
void increment()
else
//若在最右節點++或最左節點--時,就會找到向上找到header。這樣就防止了越界情況
if (node->right != y)
node = y;
}}//遞減
void decrement()
else
node = y;
}} self
& operator--()
self operator--(int)
其他的符號操作較為簡單,這裡不在贅述。 二叉搜尋樹 使用迭代器
迭代器 它的用法與指標用法相同 使用迭代器實現二叉搜尋樹,使用有兩個指標域的頭結點實現,並且多給bstree中加入乙個雙親結點 pparent。ref operator 解引用 ptr operator bool operator const self s bool operator const s...
Leetcode 31 二叉搜尋樹迭代器
題目 實現乙個二叉搜尋樹迭代器類bstiterator 表示乙個按中序遍歷二叉搜尋樹 bst 的迭代器 bstiterator treenode root 初始化 bstiterator 類的乙個物件。bst 的根節點 root 會作為建構函式的一部分給出。指標應初始化為乙個不存在於 bst 中的數...
leetcode 173 二叉搜尋樹迭代器
實現乙個二叉搜尋樹迭代器類bstiterator 表示乙個按中序遍歷二叉搜尋樹 bst 的迭代器 bstiterator treenode root 初始化 bstiterator 類的乙個物件。bst 的根節點 root 會作為建構函式的一部分給出。指標應初始化為乙個不存在於 bst 中的數字,且...