头文件:
#ifndef _THREADBINTREE_H
#define _THREADBINTREE_Htypedef enum{LINK,THREAD}Tag;
template<class Type>
class BinTree;
template<class Type>
class BinTreeNode
{
friend BinTree<Type>;
public:
BinTreeNode(Type d=Type()):leftChild(NULL),rightChild(NULL),ltag(LINK),rtag(LINK),data(d)
{}
~BinTreeNode()
{}
private:
Type data;
BinTreeNode<Type> *leftChild;
BinTreeNode<Type> *rightChild;
Tag ltag;
Tag rtag;
};
template<class Type>
class BinTree
{
public:
BinTree(Type ref):root(NULL),refval(ref)
{}
void create_tree(const char *&str)
{
create_tree(root,str);
}
void create_tree(BinTreeNode<Type> *&t,const char *&str)
{
if(*str==refval)
t=NULL;
else
{
t=new BinTreeNode<Type>(*str);
create_tree(t->leftChild,++str);
create_tree(t->rightChild,++str);
}
}
void create_threadBinTree();
void create_threadBinTree(BinTreeNode<Type> *&t,BinTreeNode<Type> *&pre);
void InOrder()const
{
InOrder(root);
}
void InOrder(BinTreeNode<Type> *t)const
{
if(t!=NULL)
{
InOrder(t->leftChild);
cout<<t->data<<" ";
InOrder(t->rightChild);
}
}
BinTreeNode<Type>* first();
BinTreeNode<Type>*first(BinTreeNode<Type>*t);
BinTreeNode<Type>* last();
BinTreeNode<Type>* last(BinTreeNode<Type> *t);
BinTreeNode<Type>* next(BinTreeNode<Type> *cur);
BinTreeNode<Type>* prior(BinTreeNode<Type> *cur);
void inorder();
void inorder(BinTreeNode<Type> *t);
BinTreeNode<Type>*parent(BinTreeNode<Type> *cur);
BinTreeNode<Type>* parent(BinTreeNode<Type> *t,BinTreeNode<Type> *cur);
~BinTree()
{
//
}
private:
BinTreeNode<Type> *root;
Type refval;
};
template<class Type>
void BinTree<Type>::create_threadBinTree()
{
BinTreeNode<Type> *pre=NULL;
create_threadBinTree(root,pre);
pre->rightChild=NULL;
pre->rtag=THREAD;
}
template<class Type>
void BinTree<Type>::create_threadBinTree(BinTreeNode<Type>*&t,BinTreeNode<Type> *&pre)
{
if(t==NULL)
return ;
create_threadBinTree(t->leftChild,pre);
if(t->leftChild==NULL)
{
t->leftChild=pre;
t->ltag=THREAD;
}
if(pre!=NULL&&pre->rightChild==NULL)
{
pre->rtag=THREAD;
pre->rightChild=t;
}
pre=t;
create_threadBinTree(t->rightChild,pre);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::first()
{
first(root);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::first(BinTreeNode<Type>*t)
{
if(t==NULL)
return NULL;
while(t->ltag==LINK)
t=t->leftChild;
return t;
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::last()
{
last(root);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::last(BinTreeNode<Type> *t)
{
if(t==NULL)
return t;
while(t->rtag==LINK)
t=t->rightChild;
return t;
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::prior(BinTreeNode<Type> *t)
{
if(t==NULL)
return NULL;
if(t->rtag==THREAD)
return t->leftChild;
else
return first(t->leftChild);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::next(BinTreeNode<Type>*t)
{
if(t==NULL)
return NULL;
if(t->rtag==THREAD)
return t->rightChild;
else
return first(t->rightChild);
}
template<class Type>
void BinTree<Type>::inorder()
{
inorder(root);
}
template<class Type>
void BinTree<Type>::inorder(BinTreeNode<Type> *t)
{
for(t=first(t);t!=NULL;t=next(t))
cout<<t->data<<" ";
cout<<endl;
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::parent(BinTreeNode<Type> *cur)
{
parent(root,cur);
}
template<class Type>
BinTreeNode<Type>* BinTree<Type>::parent(BinTreeNode<Type> *t,BinTreeNode<Type> *cur)
{
if(cur==NULL)
return NULL;
if(cur->ltag==THREAD)
if(cur->leftChild->leftChild==cur||cur->leftChild->rightChild==cur)
return cur->leftChild;
if(cur->rtag==THREAD)
if(cur->rightChild->leftChild==cur||cur->rightChild->rightChild==cur)
return cur->rightChild;
if(prior(first(cur->leftChild))!=NULL&&prior(first(cur->leftChild))->rightChild==cur)
return prior(first(cur->leftChild));
if((next(last(cur->leftChild))!=NULL)&&next(last(cur->rightChild))->leftChild==cur)
return next(last(cur->rightChild));
}
#endif
测试文件:test.cpp
#include"./utility.h"
#include"./threadBinTree.h"
int main()
{
BinTree<char> bt('#');
const char *ch="ABC##DE##F##G#H##";
bt.create_tree(ch);
bt.InOrder();
cout<<endl;
bt.create_threadBinTree();
bt.first();
bt.last();
bt.prior(bt.last());
bt.next(bt.next(bt.first()));
bt.inorder();
bt.parent(bt.next(bt.first()));
bt.parent(bt.next(bt.next(bt.next(bt.first()))));
}