//线索二叉树
#include <iostream>
using namespace std;
typedef enum PointerTag{Link,Thread};
/*Link:指向左右孩子,表示当前节点的左指针或右指针指向对应的左或右孩子
Thread:指向前驱后继线索,表示当前节点的左指针或右指针指向对应的前驱或后继*/
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
PointerTag LTag, RTag;//左右标志
}BiTNode,*BiTree;
BiTree pre = NULL;
//二叉树的建立,按照前序遍历的方式建立二叉树
void CreateBiTree(BiTree *T)//输入形式如AB##C##,A是根节点,BC是左右子树
{
char ch;
cin >> ch;
if (ch=='#')
{
*T = NULL;//保证是叶节点
}
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;//生成节点
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);//构造左右子树
}
}
//中序二叉树线索化
void InThreading(BiTree p)
{
if (p)
{
InThreading(p->lchild);//左子树线索化
if (!p->lchild)
{
//如果当前节点没有左孩子,LTag=1,左指针域只上一节点
p->LTag = Thread;
p->lchild = pre;
}
if (!pre->rchild)
{
//如果pre没有右孩子,RTag=1,右指针指向当前节点
pre->RTag = Thread;
pre->rchild = p;
}
pre = p;//线索化完左子树后,让pre指向当前节点
InThreading(p->rchild);//递归右子树线索化
}
}
//中序遍历二叉树并线索化,Thrt指向头节点
void InOrderThreading(BiTree &Thrt, BiTree T)
{
if (!(Thrt=(BiTree)malloc(sizeof(BiTNode))))
{
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;//最后一个节点线索化。指向虚设头节点
}
}
int main()
{
BiTree T = NULL,Thrt;
cout << "以先序遍历的方式建立二叉树:";
CreateBiTree(&T);
InOrderThreading(Thrt, T);
return 0;
}