迭代器:它的用法與指標用法相同
使用迭代器實現二叉搜尋樹,使用有兩個指標域的頭結點實現,
並且多給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 中的數字,且...