代码如下
#include<stdio.h>
#include<stdlib.h>
typedef enum {Link,Thread} PointerTag;
typedef struct ThreadNode {
char data;
struct ThreadNode* lchild, * rchild;
PointerTag ltag, rtag;
}ThreadNode,*ThreadTree;
//创建一颗二叉树,注意这里要初始化其标志位都为Link
void CreateThreadTree(ThreadTree* T) {
char c;
scanf_s("%c", &c);
if (c==' ')
{
(*T) = NULL;
}
else
{
(*T) = (ThreadTree)malloc(sizeof(ThreadNode));
(*T)->data = c;
(*T)->ltag = Link;
(*T)->rtag = Link;
CreateThreadTree(&(*T)->lchild);
CreateThreadTree(&(*T)->rchild);
}
}
//中序线索化二叉树
void inThread(ThreadTree T){
//这里的pre变量要么定义到函数外,要么用static修饰
static ThreadTree pre = NULL;
if (T)
{
inThread(T->lchild);
if (T->lchild==NULL)
{
T->ltag = Thread;
T->lchild = pre;
}
if (pre != NULL && pre->rchild==NULL)
{
pre->rtag = Thread;
pre->rchild = T;
}
pre = T;
inThread(T->rchild);
}
}
//求后继
ThreadTree next(ThreadTree T) {
ThreadTree result = NULL;
if (T->rtag==Thread)
{
result = T->rchild;
}
else if (T->rtag==Link)
{
result = T->rchild;
while (result && result->ltag==Link)
{
result = result->lchild;
}
}
return result;
}
//中序遍历(正序)
void inOrder(ThreadTree T) {
ThreadTree p = T;
while (p->ltag==Link)
{
p = p->lchild;
}
while (p)
{
printf("%c ", p->data);
p = next(p);
}
}
//求前驱
ThreadTree pre(ThreadTree T) {
ThreadTree result = NULL;
if (T->ltag==Thread)
{
result = T->lchild;
}
else
{
result = T->lchild;
while (result->rtag==Link)
{
result = result->rchild;
}
}
return result;
}
//中序遍历(逆序)
void inOrderReverse(ThreadTree T) {
ThreadTree p = T;
while (p->rchild!=NULL)
{
p = p->rchild;
}
while (p)
{
printf("%c ", p->data);
p = pre(p);
}
}
//测试
int main() {
ThreadTree T = NULL;
CreateThreadTree(&T);
inThread(T);
inOrder(T);
printf("\n");
inOrderReverse(T);
}
测试:
输入: ABD_ _E_ _CF_ _ G_ _
输出:D B E A F C G
G C F A E B D //perfect!
测试用的二叉树:如下图