线索化二叉树

#include<iostream>

#include<windows.h>

using namespace std;

typedef char TElemType ;

typedef enum PointerTag{Link,Thread};

typedef struct BiThrNode{

         TElemType data;

         struct BiThrNode *lchild,*rchild;

         PointerTag LTag,RTag;

}BiThrNode,*BiThrTree;

 

void CreatTree(BiThrTree &T)

{

         TElemType item;

         cin>>item;

         if(item=='#')

                   T=NULL;

         else

         {

                   if(!(T=new BiThrNode))

                   {exit(0);}

                   T->data=item;

                   T->LTag=PointerTag(0);

       T->RTag=PointerTag(0);

                   CreatTree(T->lchild);

                   CreatTree(T->rchild);

         }

}

void InOrderTraverse(BiThrTree T)//遍历

{

         BiThrTree p;

         p=T->lchild;

         while(p!=T)

         {

                   while(p->LTag==Link)

                            p=p->lchild;

                   if(p!=NULL)

                            cout<<p->data<<'\t';

                   while(p->RTag==Thread&&p->rchild!=T)

                   {

                            p=p->rchild;

                            cout<<p->data<<'\t';

                   }

                   p=p->rchild;

         }

}

void InThreading(BiThrTree p,BiThrTree &pre)//中序遍历进行线索化

{

         if(p!=NULL)

         {

                   InThreading(p->lchild,pre);

                   if(p->lchild==NULL)

                   {

                            p->LTag=Thread;

                            p->lchild=pre;

                   }

                   if(pre->rchild==NULL)

                   {

                            pre->RTag=Thread;

                            pre->rchild=p;

                   }

         pre=p;

         InThreading(p->rchild,pre);

         }

}

void InOrderThreading(BiThrTree &Thrt,BiThrTree T)//Thrt指向头结点

{

         if(!(Thrt=new BiThrNode))

                   exit(0);

         Thrt->LTag=Link;

         Thrt->RTag=Thread;

         Thrt->rchild=Thrt;

         BiThrTree pre;

         if(!T)

                   Thrt->lchild=Thrt;

        

         else

         {

                   Thrt->lchild=T;

                   pre=Thrt;

                   InThreading(T,pre);

                   pre->rchild=Thrt;

                   pre->RTag=Thread;

                   Thrt->rchild=pre;

         }

}

BiThrNode *First(BiThrTree T)//函数返回以T为根中序线索二叉树中中序序列下的第一个结点

{

         for(BiThrTree p=T;!p->LTag;p=p->lchild);

         return p;

}

BiThrNode *Last(BiThrTree T)

{

         for(BiThrTree p=T;!p->RTag;p=p->rchild);//函数返回以T为根中序线索二叉树最后一个结点

         return p;

}

BiThrNode *Next(BiThrTree T)//结点T的后继结点

{

         if(T->RTag)

                   return T->rchild;

         else

                   return(First(T->rchild));

}

BiThrNode *Prior(BiThrTree T)//结点T的前驱结点

{

         if(T->LTag)

                   return T->lchild;

         else

                   return(Last(T->lchild));

}

 

void main()

{

         BiThrTree T,Thrt,p;

         cout<<"前序建立二叉树('#'代表空树)"<<endl;

         CreatTree(T);

         cout<<"再在进行中序线索化......"<<endl;

         //Sleep(4000);

         InOrderThreading(Thrt,T);

         cout<<"中序遍历线索化二叉树"<<endl;

         InOrderTraverse(Thrt);

         cout<<endl;

        

         p=First(Thrt->lchild);

         cout<<"第一个结点"<<p->data<<endl;

         p=Last(Thrt->lchild);

         cout<<"最后一个结点"<<p->data<<endl;

         p=Next(Thrt->lchild);

         cout<<"后继结点"<<p->data<<endl;

         p=Prior(Thrt->lchild);

         cout<<"前驱结点"<<p->data<<endl;

         system("pause");

}

 

        

/*

ABD##E##C##

*/    

posted @ 2012-11-22 23:01  ♂咱說 ろ算  阅读(236)  评论(0编辑  收藏  举报