数据结构-二叉树线索化迭代器(续上节)

来源:互联网 发布:不可抗力网络剧在线看 编辑:程序博客网 时间:2024/06/03 13:21
#pragma once#include <iostream>using namespace std;enum Type{LINK,  //指针指向的是一颗子树THREAD //指针指向的是线索化};template<typename T>struct BinaryTreeThdNode    //二叉树的节点结构{T _data;BinaryTreeThdNode* _left;BinaryTreeThdNode* _right;Type _left_type;Type _right_type;BinaryTreeThdNode(const T& data):_data(data), _left(NULL), _right(NULL), _left_type(LINK), _right_type(LINK){}};template <typename T,typename Ref, typename Ptr>  //中序Iterator   Ref和Ptr来实现const和非const迭代器的代码复用class BinaryTreeThdIterator{typedef BinaryTreeThdNode<T> Node;typedef BinaryTreeThdIterator<T, Ref, Ptr> Self;public:BinaryTreeThdIterator(Node* node):_node(node){}Ref operator*(){return _node->_data;}Ptr operator->(){return &(operator*());}Self operator++(){ _node = _Next(_node);return *this;}Self operator++(int){Self tmp(*this);_node = _Next(_node);return tmp;}Self operator--(){_node = _Prev(_node);return *this;}Self operator--(int){Self tmp(*this);_node = _Prev(_node);return tmp;}bool operator!=(const Self& s){return _node != s._node;}bool operator==(const Self& s){return _node == s._node;}protected:Node* _Next(Node* cur){if (cur->_right_type == LINK){cur = cur->_right;while (cur->_left_type == LINK){cur = cur->_left;}}else{cur = cur->_right;}return cur;}Node* _Prev(Node* cur){if (cur->_left_type == LINK){cur = cur->_left;while (cur->_right_type == LINK){cur = cur->_right;}}else{cur = cur->_left;}return cur;}protected:Node *_node;};template <typename T>class BinaryTreeThd    //二叉树的线索化{typedef BinaryTreeThdNode<T> Node;public:typedef BinaryTreeThdIterator<T, T&, T*> Iterator;typedef BinaryTreeThdIterator<T, const T&, const T*> ConstIterator;public:BinaryTreeThd(T* a, size_t size, const T& invalid = T()){size_t index = 0;_root = _CreatTree(a, size, index, invalid);}void InOrderThreading() //中序线索化{Node* prev = NULL;_InOrderThreading(_root, prev);if (prev && prev->_right == NULL)prev->_right_type = THREAD;}Iterator Begin()  {Node* cur = _root;while (cur->_left_type == LINK){cur = cur->_left;}return cur;}Iterator End(){return NULL;}
ConstIterator Begin()const{Node* cur = _root;while (cur->_left_type == LINK){cur = cur->_left;}return cur;}ConstIterator End()const{return NULL;}protected:Node* _CreatTree(T* a, size_t size, size_t& index, const T& invalid = T()){if (a[index] == invalid || index >= size)return NULL;Node* root = new Node(a[index]);root->_left = _CreatTree(a, size, ++index, invalid);root->_right = _CreatTree(a, size, ++index, invalid);return root;}void _InOrderThreading(Node* root, Node*& prev){Node* cur = root;if (cur == NULL)return;_InOrderThreading(cur->_left, prev);if (cur->_left == NULL){cur->_left = prev;cur->_left_type = THREAD;}if (prev && prev->_right == NULL){prev->_right = cur;prev->_right_type = THREAD;}prev = cur;_InOrderThreading(cur->_right, prev);}protected:Node* _root;};

0 0
原创粉丝点击