您的位置:首页 > 其它

(原创)中序线索化二叉树

2007-08-22 18:00 232 查看
根据严蔚敏教材第135页算法6.6和6.7而来,可在VC下运行。


#include <stdio.h>


#include <process.h>


#include <stdarg.h>


#include <stdlib.h>


#include <malloc.h>




#define NULL 0


#define MAXNODE 100


#define OVERFLOW -2


#define OK 1


#define TRUE 1


#define FALSE 0


#define ERROR -1


//#define Link 0


//#define Thread 1




typedef char TElemType;


typedef int Status;


typedef enum PointerTag {Link,Thread};//Link==0;指针,Thread==1;线索


typedef struct BiThrNode


{


TElemType data;


struct BiThrNode *lchild,*rchild;


PointerTag LTag,RTag;


} BiThrNode,*BiThrTree;




BiThrTree Pre;//全局变量




Status PrintElement(TElemType e)


{


printf("_%c_",e);return OK;


}//PrintElement




Status NewTree(BiThrTree &T)


{


T=(BiThrNode *)malloc(sizeof(BiThrNode));


T->data='#';


T->LTag=Link;T->RTag=Link;


T->lchild=NULL;T->rchild=NULL;


return OK;


}//NewTree




Status CreateBiTree(BiThrTree &T)


{


TElemType ch;


scanf("%c",&ch);


if(ch=='#') T=NULL;


else


{


if(!(T=(BiThrNode *)malloc(sizeof(BiThrNode))))


return OVERFLOW;


T->data=ch;


T->LTag=Link;T->RTag=Link;


printf("Create BiThrNode succeed at %c ",T->data);


CreateBiTree(T->lchild);


CreateBiTree(T->rchild);


}


return OK;


}//CreateBiThrTree




void InThreading(BiThrTree p)


{


if(p)


{


InThreading(p->lchild);


if(!(p->lchild))


{


p->LTag=Thread;p->lchild=Pre;


}


if(!(Pre->rchild))


{


Pre->RTag=Thread;Pre->rchild=p;


}


Pre=p;


InThreading(p->rchild);


}


}//InThreading




Status InOrderTraverseThreading(BiThrTree &Thrt,BiThrTree T)


{


if(!(Thrt=(BiThrNode *)malloc(sizeof(BiThrNode))))


return OVERFLOW;


Thrt->LTag=Link;Thrt->RTag=Thread;


Thrt->rchild=Thrt;


if(!T)


Thrt->lchild=Thrt;


else


{


Thrt->lchild=T;Pre=Thrt;


InThreading(T);


Pre->rchild=Thrt;Pre->RTag=Thread;


Thrt->rchild=Pre;


}


return OK;


}//InOrderTraverseThreading




Status InOrderTraverse(BiThrTree T,Status(*Visit)(TElemType e))


{


BiThrTree p;


p=T->lchild;


while(p!=T)


{


while(p->LTag==Link) p=p->lchild;


if(!Visit(p->data)) return ERROR;


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


{


p=p->rchild;Visit(p->data);


}


p=p->rchild;


}


return OK;


}//InOrderTraverse




int main()


{


BiThrTree S,T;


NewTree(T);


CreateBiTree(T);printf("CreateBiTree Complete ");


// InOrderTraverse(T,PrintElement);


InOrderTraverseThreading(S,T);


InOrderTraverse(S,PrintElement);


return 1;


}


/*运行结果:输入


-+a##*b##-c##d##/e##f##


Create BiThrNode succeed at -


Create BiThrNode succeed at +


Create BiThrNode succeed at a


Create BiThrNode succeed at *


Create BiThrNode succeed at b


Create BiThrNode succeed at -


Create BiThrNode succeed at c


Create BiThrNode succeed at d


Create BiThrNode succeed at /


Create BiThrNode succeed at e


Create BiThrNode succeed at f


CreateBiTree Complete


_a__+__b__*__c__-__d__-__e__/__f_Press any key to continue*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: