线索二叉树的基本操作
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{ //二叉树的链式存储结点
char data;
struct Node *Lchild;
struct Node *Rchild;
int Ltag;
int Rtag;
}BiTNode,*BiTree;
void CreateBiTree(BiTree *root){ //形参采用二级指针,实参为结点孩子域地址
char ch;
ch=getchar();
if(ch=='#') *root=NULL;
else{
*root=(BiTree)malloc(sizeof(BiTree));
(*root)->data=ch;
CreateBiTree(&((*root)->Lchild));
CreateBiTree(&((*root)->Rchild));
}
}
void Visit(char data){
printf("%c",data);
}
void InOrder(BiTree T){ //中序递归遍历
if(T){
InOrder(T->Lchild);
Visit(T->data);
InOrder(T->Rchild);
}
}
BiTree pre = NULL; //全局变量,pre 指向刚刚访问的树结点
void Inthread(BiTree T){ //中序线索化(递归)
if(T!=NULL){
Inthread(T->Lchild); //线索化左子树
if(T->Lchild==NULL){ //若左孩子为空,置前驱线索
T->Lchild=pre;
T->Ltag=1;
}
if(pre!=NULL&&pre->Rchild==NULL){ //若前驱右孩子为空,置其后继线索
pre->Rchild=T;
pre->Rtag=1;
}
pre=T;
Inthread(T->Rchild); //线索右子树
}
}
BiTree InPre(BiTree T){ //中序线索树找结点前驱
BiTree Pre;
if(T->Ltag==1) Pre=T->Lchild; //直接利用线索
else{
for(BiTree q=T->Lchild;q->Rtag==0;q=q->Rchild) //在T的左子树中查找最右下端的结点
Pre=q;
}
return (Pre);
}
BiTree InNext(BiTree T){ //中序线索树找结点后继
BiTree Next;
if(T->Rtag==1) Next=T->Rchild; //直接利用线索
else{
for(BiTree q=T->Rchild;q->Ltag==0;q=q->Lchild) //在T的左子树中查找最右下端的结点
Next=q;
}
return (Next);
}
BiTree InFirst(BiTree T){ //中序线索树中求遍历的第一个结点
BiTree p=T;
if(p==NULL) return (NULL);
while(p->Ltag==0) p=p->Lchild;
return p;
}
void TiOrder(BiTree T){ //遍历中序二叉线索树
BiTree p;
p=InFirst(T);
while(p!=NULL){
Visit(p->data);
p=InNext(p);
}
}
int main(){
BiTree T;
CreateBiTree(&T);
InOrder(T);
return 0;
}