线索二叉树

来源:互联网 发布:js页面加载事件 编辑:程序博客网 时间:2024/05/12 09:34

ThreadNode.h

template<typename Type> class ThreadTree;template<typename Type> class ThreadInorderIterator;template<typename Type> class ThreadNode{public:friend class ThreadTree<Type>;friend class ThreadInorderIterator<Type>;private:int m_nleftthread, m_nrightthread;ThreadNode<Type> *m_pleft, *m_pright;Type m_data;public:ThreadNode():m_nleftthread(1),m_nrightthread(1){m_pleft = this;m_pright = this;}ThreadNode(const Type item):m_data(item),m_pleft(NULL),m_pright(NULL),m_nleftthread(0),m_nrightthread(0){}};

ThreadTree.h

#include "ThreadNode.h"template<typename Type> class ThreadInorderIterator;template<typename Type> class ThreadTree{public:friend class ThreadInorderIterator<Type>;ThreadTree():m_proot(new ThreadNode<Type>()){}private:ThreadNode<Type> *m_proot;};

ThreadInorderIterator.h

#include "ThreadTree.h"template<typename Type> class ThreadInorderIterator{private:ThreadTree<Type> &m_ptree;ThreadNode<Type> *m_pcurrent;void InThread(ThreadNode<Type> *current, ThreadNode<Type> *pre);public:ThreadInorderIterator(ThreadTree<Type> &tree):m_ptree(tree),m_pcurrent(tree.m_proot){}ThreadNode<Type> *First();ThreadNode<Type> *Prior();ThreadNode<Type> *Next();void Print();void Print(ThreadNode<Type> *start, int n = 0);void InOrder();void InsertLeft(ThreadNode<Type> *left);void InsertRight(ThreadNode<Type> *right);ThreadNode<Type> *GetParent(ThreadNode<Type> *current);};

ThreadInorderIterator.cpp

template<typename Type> void ThreadInorderIterator<Type>::InThread(ThreadNode<Type> *current, ThreadNode<Type> *pre){if(current!=m_ptree.m_proot){InThread(current->m_pleft,pre);if(current->m_pleft==NULL){current->m_pleft=pre;current->m_nleftthread=1;}if(pre->m_pright==NULL){pre->m_pright=current;pre->m_nrightthread=1;}pre=current;InThread(current->m_pright,pre);}}template<typename Type> ThreadNode<Type>* ThreadInorderIterator<Type>::First(){while(m_pcurrent->m_nleftthread==0){m_pcurrent=m_pcurrent->m_pleft;}return m_pcurrent;}template<typename Type> ThreadNode<Type>* ThreadInorderIterator<Type>::Prior(){ThreadNode<Type> *pmove=m_pcurrent->m_pleft;if(0==m_pcurrent->m_nleftthread){while(0==pmove->m_nrightthread){pmove=pmove->m_pright;}}m_pcurrent=pmove;if(m_pcurrent==m_ptree.m_proot){return NULL;}return m_pcurrent;}template<typename Type> ThreadNode<Type>* ThreadInorderIterator<Type>::Next(){ThreadNode<Type> *pmove=m_pcurrent->m_pright;if(0==m_pcurrent->m_nrightthread){while(0==pmove->m_nleftthread){pmove=pmove->m_pleft;}}m_pcurrent=pmove;if(m_pcurrent==m_ptree.m_proot){return NULL;}return m_pcurrent;}template<typename Type> void ThreadInorderIterator<Type>::InOrder(){ThreadNode<Type> *pmove=m_ptree.m_proot;while(pmove->m_pleft!=m_ptree.m_proot){//有左孩子pmove=pmove->m_pleft;}m_pcurrent=pmove;cout<<"root";while(pmove!=m_ptree.m_proot&&pmove){cout<<"--->"<<pmove->m_data;pmove=this->Next();}cout<<"--->end";}template<typename Type> void ThreadInorderIterator<Type>::InsertLeft(ThreadNode<Type> *left){left->m_pleft=m_pcurrent->m_pleft;left->m_nleftthread=m_pcurrent->m_nleftthread;left->m_pright=m_pcurrent;left->m_nrightthread=1;m_pcurrent->m_pleft=left;m_pcurrent->m_nleftthread=0;if(0==left->m_nleftthread){m_pcurrent=left->m_pleft;ThreadNode<Type> *temp=First();temp->m_pright=left;}m_pcurrent=left;}template<typename Type> void ThreadInorderIterator<Type>::InsertRight(ThreadNode<Type> *right){right->m_pright=m_pcurrent->m_pright;right->m_nrightthread=m_pcurrent->m_nrightthread;right->m_pleft=m_pcurrent;right->m_nleftthread=1;m_pcurrent->m_pright=right;m_pcurrent->m_nrightthread=0;if(0==right->m_nrightthread){m_pcurrent=right->m_pright;ThreadNode<Type> *temp=First();temp->m_pleft=right;}m_pcurrent=right;}template<typename Type> ThreadNode<Type>* ThreadInorderIterator<Type>::GetParent(ThreadNode<Type> *current){ThreadNode<Type> *pmove=current;while(0==pmove->m_nleftthread){pmove=pmove->m_pleft;}pmove=pmove->m_pleft;if(pmove==m_ptree.m_proot){if(pmove->m_pleft==current){return NULL;}}if(pmove->m_pright==current){return pmove;}pmove=pmove->m_pright;while(pmove->m_pleft!=current){pmove=pmove->m_pleft;}return pmove;}template<typename Type> void ThreadInorderIterator<Type>::Print(ThreadNode<Type> *start, int n){if(start->m_nleftthread&&start->m_nrightthread){for(int i=0;i<n;i++){cout<<"     ";}if(n>=0){cout<<start->m_data<<"--->"<<endl;}return;}if(start->m_nrightthread==0){Print(start->m_pright,n+1);}for(int i=0;i<n;i++){cout<<"     ";}if(n>=0){cout<<start->m_data<<"--->"<<endl;}if(start->m_nleftthread==0){Print(start->m_pleft,n+1);}}template<typename Type> void ThreadInorderIterator<Type>::Print(){Print(m_ptree.m_proot->m_pleft);}

Test.cpp

#include <iostream>using namespace std;#include "ThreadInorderIterator.h"int main(){ThreadTree<int> tree;ThreadInorderIterator<int> threadtree(tree);int init[10]={3,6,0,2,8,4,9,1,5,7};for(int i=0;i<10;){threadtree.InsertLeft(new ThreadNode<int>(init[i++]));threadtree.InsertRight(new ThreadNode<int>(init[i++]));}threadtree.Print();cout<<endl<<endl;threadtree.InOrder();return 0;}