不知道哪里出了问题 创建为先序创建
线索化及遍历都是中序 不知道为什么跑不出来
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//原二叉链表中添加ltag和rtag
//ltag 0表示lchild指向左孩子 1表示lchild指向结点前驱
//rtag 0表示rchild指向右孩子 1表示rchild指向结点后继
/*建立线索化二叉树实质上是遍历一棵二叉树,在遍历过程中检查左右指针域
是否为空,若为空,将指针改为前驱结点或者后继结点的线索*/
enum Ptag{Link,Thread}; //Link(0) Thread(1)
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
Ptag ltag,rtag;
}BiTNode,*BiTree;
BiTree pre=NULL; //全局变量
void TThread(BiTree p) //P为根结点的二叉树中序线索化
{ //每次判断当前访问节点的ltag和上一次访问节点rtag
if(p!=NULL)
{
TThread(p->lchild);
if(p->lchild==NULL){
p->ltag=Thread;
p->lchild=pre;
}
else
p->ltag=Link;
if(pre->rchild==NULL){
pre->rchild=p;
pre->rtag=Thread;
}
else
pre->rtag=Link;
pre=p;
TThread(p->rchild);
}
}
BiTree CreatTree(BiTree bt) //对bt根结点的二叉树线索化 增加一个头结点head
{
BiTree head;
head=(BiTree)malloc(sizeof(BiTNode));
head->ltag=Link;
head->rtag=Thread;
head->rchild=bt;
if(bt==NULL)
head->rchild=head;
else{
head->lchild=bt;
pre=head;
TThread(bt);
pre->rchild=head;
pre->rtag=Thread;
head->rchild=pre;
}
return head;
}
void createBiTree(BiTree *T) //若传值为BiTree T,形参传递而不是实参传递
{
ElemType ch;
scanf("%c",&ch);
getchar();
// fflush(stdin);
if (ch=='#')
{
*T = NULL;
return;
}
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
if (!*T)
exit(1);
(*T)->data=ch;
printf("请输入左子树:\n");
createBiTree(&((*T)->lchild)); //左
printf("请输入右子树:\n");
createBiTree(&((*T)->rchild)); //右
}
}
BiTree InFirst(BiTree Bt) //寻找中序遍历第一个结点
{
BiTree p=Bt;
if(!p) return(NULL);
while(p->ltag==0){
p=p->lchild;
}
return p;
}
BiTree InNext(BiTree p) //寻找当前结点的后继结点
{
BiTree Next;
if(p->rtag==1) Next=p->rchild;
else{
BiTree q=NULL;
for(BiTree q=p->rchild;q->ltag==0;q=q->lchild);
Next=q;
}
return Next;
}
void VisitBt(BiTree p) //遍历中序线索二叉树
{
BiTree q=InFirst(p);
while(q){
printf("%d\n",q->ltag);
// printf("aaaaaaaaaaaaaaaaaaaaaa\n");
q=InNext(q);
}
}
int main()
{
BiTree T,Tree;
createBiTree(&T);
Tree=CreatTree(T);
VisitBt(Tree->lchild);
return 0;
}
求帮助 wan'fen'gan'xie