马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
//Link(0)表示指向左右孩子的指针
//Thread(1)表示指向前驱后继的线索
typedef enum {Link,Thread} PointerTag;
typedef struct BiThrNode
{
ElemType data;
struct BiThrNode *lchild,*rchild;
PointerTag ltag;
PointerTag rtag;
}BiThrNode,*BiThrTree;
BiThrTree pre;
//创建二叉树,前序遍历输入数据
void CreatBiThrTree(BiThrTree *T)
{
char c;
scanf("%c",&c);
if (c==' ')
{
*T=NULL;
}
else
{
*T=(BiThrNode *)malloc(sizeof(BiThrNode));
(*T)->data=c;
(*T)->ltag=Link;
(*T)->rtag=Link;
CreatBiThrTree(&(*T)->lchild);
CreatBiThrTree(&(*T)->rchild);
}
}
//中序遍历线索化
void InThreading(BiThrTree T)
{
if (T)
{
InThreading(T->lchild);
if (!T->lchild)
{
T->ltag=Thread;
T->lchild=pre;
}
if (!T->rchild)
{
pre->rtag=Thread;
pre->rchild=T;
}
pre=T;
InThreading(T->rchild);
}
}
void InOrderThreading(BiThrTree *p, BiThrTree T)
{
*p=(BiThrNode *)malloc(sizeof(BiThrNode));
if (!p)
{
exit(0);
}
(*p)->ltag=Link;
(*p)->rtag=Thread;
(*p)->rchild=(*p);
if (!T)
{
(*p)->lchild=*p;
}
else
{
(*p)->lchild=T;
pre=*p;
InThreading(T);
pre->rchild=*p;
pre->rtag=Thread;
(*p)->rchild=pre;
}
}
void visit(char c)
{
printf("%c ", c);
}
void InOrderTraverse(BiThrTree T)
{
if (T)
{
InOrderTraverse(T->lchild);
visit(T->data);
InOrderTraverse(T->rchild);
}
}
int main(void)
{
BiThrTree P,T=NULL;
CreatBiThrTree(&T);
InOrderThreading(&P,T);
printf("中序遍历结果为:");
InOrderTraverse(P);
printf("\n");
return 0;
}
是不是InOrderTraverse函数不正确,把InOrderTraverse函数更换成小甲鱼课程里的迭代办法的代码就可以输出结果void InOrderTraverse( BiThrTree T )
{
BiThrTree p;
p = T->lchild;
while( p != T )
{
while( p->ltag == Link )
{
p = p->lchild;
}
visit(p->data);
while( p->rtag == Thread && p->rchild != T )
{
p = p->rchild;
visit(p->data);
}
p = p->rchild;
}
}
|