65,210
社区成员
发帖
与我相关
我的任务
分享#include<iostream>
#include<cstdlib>
using namespace std;
enum PointerTag{Link,Thread};
template<class T>
class TreeNode
{
private:
TreeNode<T>* left;
TreeNode<T>* right;
public:
T data;
PointerTag LTag,RTag;
TreeNode(const T& item,TreeNode<T>* lptr,TreeNode<T>* rptr,PointerTag LT,PointerTag RT);
TreeNode<T>*& Left();
TreeNode<T>*& Right();
};
TreeNode<char>* pre;
template<class T>
TreeNode<T>::TreeNode(const T& item,TreeNode<T>* lptr,TreeNode<T>* rptr,PointerTag LT,PointerTag RT)
{
data=item;
left=lptr;
right=rptr;
LTag=LT;
RTag=RT;
}
template<class T>
TreeNode<T>*& TreeNode<T>::Left()
{
return left;
}
template<class T>
TreeNode<T>*& TreeNode<T>::Right()
{
return right;
}
template<class T>
TreeNode<T>* GetTreeNode(T item,TreeNode<T>* lptr,TreeNode<T>* rptr,PointerTag LT,PointerTag RT)
{
TreeNode<T>* p=new TreeNode<T>(item,lptr,rptr,LT,RT);
if(p==NULL)
{
cout<<"memory location failure"<<endl;
exit(1);
}
return p;
}
template<class T>
void FreeNode(TreeNode<T>* ptr)
{
delete ptr;
}
template<class T>
void InorderTree(TreeNode<T>* t)
{
if(t!=NULL)
{
InorderTree(t->Left());
cout<<t->data;
InorderTree(t->Right());
}
}
template<class T>
void CountLeaf(TreeNode<T>* t,int& count)
{
if(t!=NULL)
{
CountLeaf(t->Left(),count);
CountLeaf(t->Right(),count);
if(t->Left()==NULL && t->Right()==NULL)
count++;
}
}
template<class T>
int Depth(TreeNode<T>* t)
{
int left_depth=0,right_depth=0,tree_depth=0;
if(t==NULL)
{
return 0;
}
else
{
left_depth=Depth(t->Left());
right_depth=Depth(t->Right());
tree_depth=1+((left_depth>=right_depth)?left_depth:right_depth);
}
return tree_depth;
}
template<class T>
void DeleteTree(TreeNode<T>* t)
{
if(t!=NULL)
{
DeleteTree(t->Left());
DeleteTree(t->Right());
FreeNode(t);
}
}
template<class T>
void InThreading(TreeNode<T>* p)
{
if(p)
{
InThreading(p->Left());
if(!p->Left())
{
p->LTag=Thread;
p->Left()=pre;
}
if(!pre->Right())
{
pre->RTag=Thread;
pre->Right()=p;
}
pre=p;
InThreading(p->Right());
}
if(p==NULL)
{
cout<<"程序内部错误"<<endl;
exit(1);
}
}
template<class T>
void InOrderThreading(TreeNode<T>* Thrt,TreeNode<T>* t)
{
Thrt=(TreeNode<T>*)malloc(sizeof(TreeNode<T>));
if(!Thrt)
{
cout<<"内存不足,程序关闭"<<endl;
exit(1);
}
Thrt->LTag=Link;
Thrt->RTag=Thread;
Thrt->Right()=Thrt;
TreeNode<T>* pre;
if(!t)
{
Thrt->Left()=Thrt;
}
else
{
Thrt->Left()=t;
pre=Thrt;
InThreading(t);
pre->Right()=Thrt;
pre->RTag=Thread;
Thrt->Right()=pre;
}
}
template<class T>
void InOrderTraverse_Thr(TreeNode<T>* t)
{
TreeNode<T>*p=t->Left();
while(p!=t)
{
while(p->LTag==Link) p=p->Left();
if(p) cout<<p->data;
while(p->RTag==Thread && p->Right()!=t)
{
p=p->Right();
cout<<p->data;
}
p=p->Right();
}
}
void main()
{
TreeNode<char>* root;
TreeNode<char>* a_lptr=NULL,*a_rptr=NULL;
TreeNode<char>* b_lptr=NULL,*b_rptr=NULL;
TreeNode<char>* c_lptr=NULL,*c_rptr=NULL;
TreeNode<char>* d_lptr=NULL,*d_rptr=NULL;
TreeNode<char>* e_lptr=NULL,*e_rptr=NULL;
TreeNode<char>* p=GetTreeNode('E',e_lptr,e_rptr,Link,Link);
TreeNode<char>* q=GetTreeNode('D',d_lptr,d_rptr,Link,Link);
TreeNode<char>* r=GetTreeNode('B',b_lptr,q,Link,Link);
TreeNode<char>* s=GetTreeNode('C',p,c_rptr,Link,Link);
TreeNode<char>* t=GetTreeNode('A',r,s,Link,Link);
root=t;
int depth=0;
depth=Depth(root);
cout<<depth<<endl;
InorderTree(root);
cout<<endl;
int count=0;
CountLeaf(root,count);
cout<<count<<endl;
cout<<"线索二叉树:"<<endl;
TreeNode<char>* Thrt=NULL;
InOrderThreading(Thrt,root);
//InOrderTraverse_Thr(root);
DeleteTree(root);
}
//二叉树的二叉线索链表表示
typedef struct BiThrNode
{
ElemType data;
struct BiThrNode *lchild,*rchild;//左、右孩子指针
int ltag,rtag;//左、右线索标志,为0时,表示lchild(rchild)指向结点的左(右)孩子;为1时,表示lchild(rchild)指向结点前驱(后继)
}BiThrNode,*BiThrNode;
//中序遍历二叉树T,并将其中序线索化
void InorderThread(BiThrTree p)
{
if(p)
{//初始化时,p指向根结点T,pre的初值为NULL
InorderThread(p->lchild);//左子树线索化
if(!p->lchild)p->ltag=1;//建立左线索标志
if(!p->rchild)p->rtag=1;//建立右线索标志
if(pre)
{
if(pre->rtag==1)pre->rchild=p;//pre的右线索指向*p
if(p->ltag==1)p->lchild=pre;//p的左线索指向*pre
}
pre=p;
InorderThread(p->rchild);//右子树线索化
}
}