为了便于遍历线索二叉树,我们为其添加一个头结点,头结点左孩子指向原二叉树的根结点,右孩子指针指向中序遍历的最后一个结点。 同时,将第一个结点左孩子指针指向头结点,最后一个结点的右孩子指针指向头结点。 如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char data;
int ltag, rtag;
struct node* lchild;
struct node* rchild;
}TBTNode;
TBTNode* pre;
TBTNode* Create()
{
TBTNode* root = NULL;
char data;
scanf("%c", &data);
if (data != '#')
{
root = (TBTNode*)malloc(sizeof(TBTNode));
root->ltag = root->rtag = 0;
root->data = data;
root->lchild = Create();
root->rchild = Create();
}
return root;
}
void Thread(TBTNode* root)
{
if (root != NULL)
{
Thread(root->lchild);
if (root->lchild == NULL)
{
root->lchild = pre;
root->ltag = 1;
}
if ( pre->rchild == NULL)//不用设置!pre了,因为之前已经把pre设置为头节点了
{
pre->rchild = root;
pre->rtag = 1;
}
pre = root;
Thread(root->rchild);
}
}
void ThInOrder(TBTNode* root)
{
TBTNode *tb = root->lchild;
while (tb!= root)
{
while (tb->ltag == 0)
tb = tb->lchild;//找到第一个节点
printf("%c", tb->data);//输出
while (tb->rtag == 1 && tb->rchild != root)
{
tb = tb->rchild;
printf("%c", tb->data);
}
tb = tb->rchild;
}
}
TBTNode* CreateThread(TBTNode* b)
{
TBTNode* root;
root = (TBTNode*)malloc(sizeof(TBTNode));
root->ltag = 0; root->rtag = 1;
root->rchild = b;
if (b == NULL)
{
root->lchild = root;
}
else
{
root->lchild = b;
pre = root;
Thread(b);
pre->rchild = root;
pre->rtag = 1;
root->rchild = pre;
}
return root;
}
int main()
{
TBTNode* head,*root;
root= Create();
head = CreateThread(root);
ThInOrder(head);
return 0;
}
运行结果如下