欢迎加qq群:453398542 学习讨论,会定期分享资料课程,解答问题。
线索二叉树的建立与遍历
#include<stdio.h>
#include<stdlib.h>
typedef enum PointerTag{Link, Thread};
typedef struct BiThrNode{
char data;
struct BiThrNode *lchild, *rchild;
PointerTag Ltag, Rtag;
}BiThrNode, *BiThrTree;
BiThrTree pre; //全局变量
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);
}
}
void BiTree_Thread(BiThrTree bt,BiThrTree &Thrt){
//中序线索化
Thrt=(BiThrTree)malloc(sizeof(BiThrNode));
Thrt->Ltag=Link; Thrt->Rtag=Thread;
Thrt->rchild=Thrt;
if(!bt){
Thrt->Ltag=Thread; Thrt->lchild=Thrt;
}
else{
Thrt->lchild=bt; pre=Thrt;
InThreading(bt);
pre->Rtag=Thread; pre->rchild=Thrt;
Thrt->rchild=pre;
}
}
void visit(char ch){
printf("%3c",ch);
}
void InOrderTravrese_Thrt(BiThrTree Thrt){
//中序遍历
BiThrTree p;
p=Thrt->lchild;
while(p!=Thrt){
while(p->Ltag==Link){
p=p->lchild;
}
visit(p->data);
while(p->Rtag==Thread&&p->rchild!=Thrt){
p=p->rchild;
visit(p->data);
}
p=p->rchild;
}
}
void CreatBiTree(BiThrTree &bt){
//构造二叉树
char ch;
ch=getchar();
if(ch=='#')
bt=NULL;
else{
bt=(BiThrTree)malloc(sizeof(BiThrNode));
bt->data=ch;
CreatBiTree(bt->lchild);
CreatBiTree(bt->rchild);
}
}
int main(){
BiThrTree bt;
BiThrTree Thrt;
printf("输入数据:\n");
CreatBiTree(bt);
BiTree_Thread(bt,Thrt);
InOrderTravrese_Thrt(Thrt);
return 0;
}