问题:中序线索化二叉树后,无法打印中序线索二叉树
#include<stdio.h>
#include<stdlib.h>
typedef struct BT
{
char data;
int ltag,rtag;
struct BT *lchild, *rchild;
} BT;
//先序遍历建立二叉树
BT * Create_tree()
{
BT * T;
char a;
scanf_s("%c",&a);
getchar();
if(a == '0')
T=NULL;
else {
T=(BT*)malloc(sizeof(BT));
T->data = a;
T->ltag= 0;
T->rtag = 0;
printf("请输入%c的左孩子:", T->data);
T->lchild=Create_tree();
printf("请输入%c的右孩子:", T->data);
T->rchild=Create_tree();
}
return T;
}
//先序遍历
void preorder(BT *T) {
if(T== NULL)
return;
else
{
printf("%c ",T->data);
preorder(T->lchild);
preorder(T->rchild);
}
}
//中序线索化二叉树,使之成为中序线索二叉树
void inorderCreateTree(BT * p,BT * pre)
{
if(p != NULL)
{
inorderCreateTree(p->lchild,pre);
if(p->lchild == NULL)
{
p->ltag = 1;
p->lchild = pre;
}
if(pre!= NULL && pre->rchild == NULL)
{
pre->rtag = 1;
pre->rchild = p;
}
pre = p; //前驱结点记录当前结点
inorderCreateTree(p->rchild,pre);
}
}
//(中序遍历的第一个节点)查找第一个结点,即根结点的最左下结点
BT *first(BT *p)
{
if(p!=NULL)
{
while(p->ltag == 0)
p = p->lchild;
}
return p;
}
//(中序遍历的最后一个节点)查找最后一个结点,即根结点的最右下结点
BT *last(BT *p)
{
if(p!= NULL)
{
while(p->rtag == 0)
p = p->rchild;
}
return p;
}
//查找当前结点的后继结点,即其右孩子的最左下结点
BT *next(BT *p)
{
if(p!= NULL)
{
if(p->rtag == 0)
return first(p->rchild);
}
return p->rchild;
}
//查找当前结点的前驱结点,即其左孩子的最右下结点
BT *prefind(BT *p)
{
if(p!= NULL)
{
if(p->ltag == 0)
return last(p->lchild);
}
return p->lchild;
}
//中序遍历中序线索二叉树
void inorder(BT* T)
{
BT * p;
for(p=first(T); p!=NULL; p=next(p))
{
printf("%c ",p->data);
}
}
int main()
{
BT *T; BT * pre=NULL;
printf("先序遍历建立和打印二叉树:\n");
T=Create_tree();
printf("先序遍历:");
preorder(T);
printf("\n");
printf("中序遍历线索化和打印中序线索二叉树:\n");
if(T!= NULL)
{
//中序线索化二叉树
inorderCreateTree(T,pre);
//末尾结点处理
pre->rtag =1;
pre->rchild=NULL;
}
inorder(T);
printf("\n");
return 0;
}