【資料結構】迭代器實現二叉樹的中序遍歷
阿新 • • 發佈:2019-01-09
迭代器
T表示型別,Ref表示引用,Ptr表示指標template<class T,class Ref,class Ptr> struct __TreeIterator { typedef BinTreeNode<T> Node; typedef __TreeIterator<T,Ref,Ptr> Self; __TreeIterator() {} __TreeIterator(Node* node) :_node(node) {} Ref operator*() { assert(_node); return _node->_date; } Self& operator++() { assert(_node); if(_node->RightTag==Link) { Node* right=_node->rightchild; while (right&&right->LeftTag==Link) { right=right->leftchild; } _node=right; } else { _node=_node->rightchild; } return *this; } Self& operator++(int) { Self tmp(*this); ++(*this); return tmp; } Self& operator--() { assert(_node); if(_node->LeftTag=Link) { Node* left=_node->leftchild; while (left&&left->RightTag==Link) { left=left->rightchild; } _node=left; } else { _node=_node->leftchild; } return *this; } bool operator!=(const Self s) const { return _node!=s._node; } Node* _node;
二叉樹的實現
需要實現begin和end
template <class T> class BinTree { typedef BinTreeNode<T> Node; public: typedef __TreeIterator<T,T&,T*> Iterator; typedef __TreeIterator<T,const T&,const T* > ConstIterator; Iterator Begin() { Node* cur=_root; while (cur&&cur->LeftTag==Link) { cur=cur->leftchild; } return Iterator(cur); } ConstIterator Begin()const; Iterator End() { return Iterator(0); } ConstIterator End()const; BinTree() :_root(NULL) {} BinTree(T* a,size_t size,const T& invalid) :_root(NULL) { size_t index=0; _CreateTree( _root,a,size,index,invalid); } void InOrderThead() { Node* pre=NULL; _InOrderThead(_root,pre); } protected: void _CreateTree(Node*& root,T a[],size_t size,size_t& index ,const T& invalid) { assert(a); if(index< size&& a[index]!=invalid) { root=new Node(a[index]); _CreateTree(root->leftchild,a,size,++index,invalid); _CreateTree(root->rightchild,a,size,++index,invalid); } } void _InOrderThead(Node* root,Node* &pre) { if(root==NULL) return ; _InOrderThead(root->leftchild,pre); if(root->leftchild==NULL) { root->LeftTag=Thread; root->leftchild=pre; } if(pre&&pre->rightchild==NULL) { pre->RightTag=Thread; pre->rightchild=root; } pre=root; _InOrderThead(root->rightchild,pre); } private: Node* _root; };
測試用例
void test()
{
int a1[10]={1,2,3,'#','#',4,'#','#',5,6};
BinTree<int> t1(a1,10,'#');
t1.InOrderThead();
//t1.InOrder_NonR();
BinTree<int>::Iterator it=t1.Begin();
cout<<endl;
while (it!=t1.End())
{
cout<<*it<<" ";
++it;
}
cout<<endl;
}