#include<stdio.h>
#include<iostream>
#include<cstdio>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef char TElemType;
/*线索二叉树的结构*/
typedef enum PointerTag{Link,Thread};//Link==0,指针;Thread==1,线索
typedef struct BiThrNode
{
TElemType data; //结点数据
PointerTag ltag, rtag;//左右标志
struct BiThrNode *lchild,*rchild;//左右孩子指针
}BiThrNode,*BiThrTree;
Status PrintElement(TElemType e)// 输出结点里面的值
{
cout << e;
return OK;
}
// 创建线索二叉树
Status CreateBiThrTree(BiThrTree &T)
{
char ch;
cin >> ch;
if (ch == '!')
T = NULL;
else
{
if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))
exit(OVERFLOW);
T->data = ch;
T->ltag = Link;
T->rtag = Link;
CreateBiThrTree(T->lchild);
CreateBiThrTree(T->rchild);
}
return OK;
}
// T指向头结点,头结点的lchild指向根节点,中序遍历线索二叉树
Status InOrderTraverse_Thr(BiThrTree T, Status(*Visit)(TElemType e))
{
BiThrTree p = T->lchild;
while (p&&(p != T))
{
while (p->ltag == Link)
{
p = p->lchild;
}
Visit(p->data);
while (p->rtag == Thread && p->rchild != T)
{
p = p->rchild;
Visit(p->data);
}
p = p->rchild;
}
return OK;
}
// 中序遍历进行二叉树线索化
void InThreading(BiThrTree p,BiThrTree &pre)
{
if (p)
{
InThreading(p->lchild,pre);//左子树线索化
if (!p->lchild)
{
p->ltag = Thread;
p->lchild = pre;//前驱线索
}
if ((!pre->rchild)&&pre->rchild==NULL)
{
pre->rtag = Thread;
pre->rchild = p;//后继线索
}
pre = p;
InThreading(p->rchild, pre);//右子树线索化
}
}
//中序遍历并线索化二叉树T,Thrt指向头结点
Status InOrderThreading(BiThrTree &Thrt, BiThrTree T)
{
if (!(Thrt = (BiThrTree)malloc(sizeof(BiThrNode)))) //建立头结点
exit(OVERFLOW);
Thrt->ltag = Link;
Thrt->rtag = Thread;
Thrt->rchild = Thrt;//右指针回指
BiThrTree pre;
if (!T)
Thrt->lchild = Thrt;//若二叉树为空,则左指针回指
else
{
Thrt->lchild = T;
pre = Thrt;
InThreading(T,pre);//中序遍历进行中序线索化
pre->rchild = Thrt;//最后一个结点线索化
pre->rtag = Thread;
Thrt->rchild = pre;
}
return OK;
}
void main(){
BiThrTree T, Thrt;
cout << "创建线索二叉树,按先序次序输入线索二叉树中结点的值:\n";
CreateBiThrTree(T);
if (InOrderThreading(Thrt, T) == OK)
cout << "成功建立中序线索化链表!\n";
cout << "中序遍历线索二叉树,结果是:\n";
InOrderTraverse_Thr(Thrt, PrintElement);
cout << endl;
}