(1)二叉树的线索化
(2)对线索二叉树进行中序遍历
#include<iostream>
using namespace std;
typedef char TElemType;
enum Status {OK = 1,ERROR = 0};
enum PointerTag{Link = 0,Thread = 1};
typedef struct BiThrNode {
TElemType data;
struct BiThrNode *lchild, *rchild;
PointerTag LTag, RTag;
}BiThrNode, *BiThrTree;
Status CreateBiTree(BiThrTree &T) {
char ch;
scanf("%c", &ch);
if (ch == ' ')T = NULL;
else {
if (!(T = (BiThrNode *)malloc(sizeof(BiThrNode))))exit(OVERFLOW);
T->RTag = T->LTag = Link;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
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);
}
}
Status InOrderThreading(BiThrTree&Thrt, BiThrTree T) {
if (!(Thrt = (BiThrTree)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 OK;
}
Status InOrderTraverse_Thr(BiThrTree T) {
BiThrTree p;
p = T->lchild;
while (p != T) {
while (p->LTag == Link)p = p->lchild;
if (printf("%c ", p->data) <= 0)return ERROR;
while (p->RTag == Thread&&p->rchild != T) {
p = p->rchild;
printf("%c ", p->data);
}
p = p->rchild;
}
return OK;
}
int main()
{
BiThrTree T1;
BiThrTree T2;
CreateBiTree(T1);
InOrderThreading(T2,T1);
InOrderTraverse_Thr(T2);
return 0;
}