05---二叉树---20195106064---陈昕.c
//输入只有一行,包含一个字符串S,用来建立二叉树。保证S为合法的二叉树先序遍历字符串,节点内容只有大写字母,且S的长度不超过100。 //共一行,包含一串字符,表示按中序遍历二叉线索树得出的节点内容,每个字母后输出一个空格。请注意行尾输出换行。 //例如;ABC DE G F #include<stdio.h> #include<stdlib.h> typedef struct { char ch; }ElemType; typedef enum {Link,Thread} PointerTag; typedef struct BiTNode{ ElemType elem; struct BiTNode *Lchild; struct BiTNode *Rchild; PointerTag LTag; PointerTag RTag; }BiTNode,*BiTree; BiTree pre; void CreatTree(BiTree *T); void InOrderThreading(BiTree *Thrt,BiTree T); void InThreading(BiTree p); void InOrderTraverse(BiTree T); void Z_Traverse(BiTree T); int main() { BiTree T; CreatTree(&T); BiTree Thrt; InOrderThreading(&Thrt,T);//中序线索化 InOrderTraverse(Thrt);//中序遍历 } void CreatTree(BiTree *T)//前序遍历建立二叉树 { char a; scanf("%c",&a); if(a==' ') { *T=NULL; } else { *T=(BiTree)malloc(sizeof(BiTNode)); (*T)->elem.ch=a; (*T)->LTag=Link;//初始化 (*T)->RTag=Link;//初始化 CreatTree( &( (*T)->Lchild ) ); CreatTree( &( (*T)->Rchild ) ); } } void InOrderThreading(BiTree *Thrt,BiTree T) { (*Thrt) = (BiTree)malloc(sizeof(BiTNode)); (*Thrt)->Rchild=*Thrt;//右指针回指 (*Thrt)->RTag=Link;//初始化 if(!T)//如果树是空 左指针也回指 { (*Thrt)->Lchild=*Thrt; (*Thrt)->LTag=Link; } else { pre=*Thrt; (*Thrt)->Lchild=T; (*Thrt)->LTag=Link; InThreading(T);//线索化 pre->Rchild=*Thrt; pre->RTag=Thread; (*Thrt)->Rchild=pre; } } void InThreading(BiTree 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); } } void InOrderTraverse(BiTree T)//遍历线索化二叉树 { BiTree p; p=T->Lchild; while(p!=T) { while(p->LTag==Link)//找到第一个左孩子为空的节点 { p=p->Lchild; } printf("%c ",p->elem.ch); while(p->RTag==Thread&&p->Rchild!=T)//线索不为空&&不是最后一个节点 { p=p->Rchild;//根据线索遍历 printf("%c ",p->elem.ch); } p=p->Rchild;//转到右子树 } }