【数据结构】迭代器实现二叉树的中序遍历
发布时间:2020-12-15 05:56:56 所属栏目:安全 来源:网络整理
导读:迭代器 templateclass T,class Ref,class Ptrstruct __TreeIterator{typedef BinTreeNodeT Node;typedef __TreeIteratorT,Ref,Ptr Self;__TreeIterator(){}__TreeIterator(Node* node):_node(node){}Ref operator*(){assert(_node);return _node-_date;}Self
迭代器 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;T表示类型,Ref表示引用,Ptr表示指针 二叉树的实现 需要实现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& index,const T& invalid) { assert(a); if(index< size&& a[index]!=invalid) { root=new Node(a[index]); _CreateTree(root->leftchild,++index,invalid); _CreateTree(root->rightchild,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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 【Absible学习】Ansible常用模块---命令类模块
- amazon-web-services – 将AWS SAM Local与docker中的dyna
- Bootstrap RESTful Docker on Ubuntu
- 由SOAP说开去 - - 谈谈WebServices、RMI、RPC、SOA、REST、
- 利用AXIS开发Webservice(一) —— 如何发布自己的webservic
- scala – 编写一个可以使用Writer和OutputStream的通用函数
- shell 学习五十天----查看进程 ps 命令
- 如何在Linux查询Nginx, Tomcat, Apache, PHP, Java的版本号
- webservice HTTP 调用
- 无法连接到docker容器中的mongodb