线索二叉树详见严蔚敏《数据结构》
结构定义
typedef char TElemType;
//Link==0:指针;Thread==1:线索
typedef enum PointerTag{Link=0,Thread};
typedef struct BiThrNode{
TElemType data;
struct BiThrNode *lchild,*rchild;//左右孩子
int LTag,RTag;
}BiThrNode,*BiThrTree;
算法
//先序创建二叉树
BiThrTree CreateBiThrTree(BiThrTree T){
TElemType ch;
scanf("%c",&ch);
if(ch==' ')
return NULL;
else{
T = (BiThrTree)malloc(sizeof(BiThrNode));
T->data = ch;
T->LTag = T->RTag = Link;
T->lchild = CreateBiThrTree(T->lchild);
T->rchild = CreateBiThrTree(T->rchild);
}
return T;
};
//pre用来记录访问结点的前一个结点
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; //保持pre指向p的前驱
InThreading(p->rchild);//右子树线索化
}
}
//中序遍历二叉树,并线索化,Thrt指向头结点
BiThrTree InOrderThreading(BiThrTree Thrt,BiThrTree T){
if(!(Thrt = (BiThrNode*)malloc(sizeof(BiThrNode)))) {
exit(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 Thrt;
}
Status PrintElement(BiThrNode p){
printf("数值:%c,左子树or前驱:%d,右子树or后继:%d\n",p.data,p.LTag,p.RTag);
if(p.LTag == Link){
printf("左子树是:%c\n",p.lchild->data);
} else{
printf("前驱是:%c\n",p.lchild->data);
}
if(p.RTag == Link){
printf("右子树是:%c\n",p.rchild->data);
} else{
printf("后继是:%c\n",p.rchild->data);
}
return OK;
}
//中序遍历二叉树的非递归算法
Status InOrderTraverse_Thr(BiThrTree T,Status(*Visit)(BiThrNode)){
BiThrNode *p = T->lchild;
while(p!=T){
while(p->LTag == Link)
p = p->lchild;
if(!Visit(*p)) return ERROR;//访问其左子树为空的结点
while(p->RTag == Thread && p->rchild != T){
p = p->rchild;
Visit(*p);//访问后继结点
}
p = p->rchild;
}
return OK;
}
main函数
/**
* 线索二叉树
* @return
*/
int main() {
BiThrTree T = NULL;
T = CreateBiThrTree(T);
//头结点
BiThrTree Thrt = NULL;
Thrt = InOrderThreading(Thrt,T);
InOrderTraverse_Thr(Thrt,PrintElement);
return 0;
}
先序序列:ABD__E__CF___