二叉搜尋樹 使用迭代器

2021-08-01 15:29:10 字數 4007 閱讀 1559

迭代器:它的用法與指標用法相同

使用迭代器實現二叉搜尋樹,使用有兩個指標域的頭結點實現,

並且多給bstree中加入乙個雙親結點_pparent。

ref operator*()//解引用

ptr operator->()//->

bool operator!=(const self

& s)

bool operator==(const self

& s)

protected:

// 取當前結點的下乙個結點

void increment()

else

//右子樹不存在

if(_pnode->_pright!=pparent)

_pnode=pparent;}}

// --取前乙個小的結點,在left子樹中

void decrement()

else

_pnode=pparent;}}

protected:

node* _pnode;

};template

class bstree

iterator begin()

iterator end()

node* find(const k& key)

return

null;

}bool insert(const k& key,const v& value)

else

else

if(key > pcur->_key)//向右插入

else

//等於根節點,不需要插入

}//插入到葉子結點後時

pcur=

new node(key,value);

if(key_key)

pparent->_pleft=pcur;

else

pparent->_pright=pcur;

pcur->_pparent=pparent;

}_phead->_pleft=leftmost();

_phead->_pright=rightmost();

return

true;

}void inorder()//中序遍歷

const k& getmaxkey()const//找最右結點(最大)

const k& getminkey()const//找最左結點(最小)

bool remove(const k& key)//刪除key結點

else

else

if(key>pcur->_key)

else

break;//找到了該節點

}//已找到待刪除結點---》1.沒有左孩子,只有右孩子

//2.沒有右孩子,只有左孩子

// 3.左右孩子都沒有

//4.左右孩子都存在

//可以合併1,3 或2,3

if(null

==pcur)

return

false;

else

else

proot=pcur->_pright;

}//2.沒有右孩子,左孩子可能存在,也可能不存在(null)

else

if(null

==pcur->_pright)

else

proot=pcur->_pleft;

} //3.左右子樹都存在

else

//交換key最小結點和根節點的值

pcur->_key=firstinorder->_key;

pcur->_value=firstinorder->_value;

if(pparent->_pleft==firstinorder)

pparent->_pleft=firstinorder->_pright;

else

pparent->_pright=firstinorder->_pright;

pcur=firstinorder;

}delete pcur;

pcur=

null;}}

_phead->_pleft=leftmost();

_phead->_pright=rightmost();

return

true;

}node* leftmost()

node* rightmost()

node*& getroot()const

node* tolist()//轉化為雙向鍊錶

protected:

void _inorder(node* proot)

}void _tolist(node* proot, node*& prev)

}private:

node* _phead;

};測試**:

#include"bstiterator.hpp"

void test1()

; for(int idx=0

;idx

bst.inorder();

bst.find(8);

cout<

.getminkey()

cout<

.getmaxkey()

}void test2()//情況三①②及情況一

; //int a=;

for(int idx=0

;idx

bst.remove(8);

bst.inorder();

bst.remove(6);

bst.inorder();

}void test3()//情況三中的③

; for(int idx=0

;idx

bst.remove(5);

bst.inorder();

}void test4()//情況二

; for(int idx=0

;idx

bst.remove(1);

bst.inorder();

bst.remove(7);

bst.inorder();

}void test5()//情況四

; for(int idx=0

;idx

bst.remove(5);

bst.inorder();

bst.remove(7);

bst.inorder();

}void test6()//情況四

; for(int idx=0

;idx

bst.remove(5);

bst.inorder();

}int main()

二叉搜尋樹的迭代器

我們經常使用著我們並不熟悉的函式 類,我們只知道它們所提供的介面以及怎樣使用。這就像我們開車在馬路上,你可能並不知道汽車是如何執行,或許你會說這並不需要知道。但至少知道一些回在車拋錨的時候你能做一些事,而不是抽根菸無所事事等維修隊過來 如果路上很擠,你就倒霉了 我們也有必要知道問題 在程式出問題的時...

Leetcode 31 二叉搜尋樹迭代器

題目 實現乙個二叉搜尋樹迭代器類bstiterator 表示乙個按中序遍歷二叉搜尋樹 bst 的迭代器 bstiterator treenode root 初始化 bstiterator 類的乙個物件。bst 的根節點 root 會作為建構函式的一部分給出。指標應初始化為乙個不存在於 bst 中的數...

leetcode 173 二叉搜尋樹迭代器

實現乙個二叉搜尋樹迭代器類bstiterator 表示乙個按中序遍歷二叉搜尋樹 bst 的迭代器 bstiterator treenode root 初始化 bstiterator 類的乙個物件。bst 的根節點 root 會作為建構函式的一部分給出。指標應初始化為乙個不存在於 bst 中的數字,且...