#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef struct BiNode{
struct BiNode *lchild,*rchild;
int ltag,rtag;
TElemType date;
}BiNode,*BiTree;
int InitBiTree(BiTree *t)
{
(*t)=(BiNode*)malloc(sizeof(BiNode));
if(!(*t)) return 0;
(*t)->lchild=NULL;
(*t)->rchild=NULL;
(*t)->date='\0';
(*t)->ltag=0;
(*t)->rtag=0;
}
int CreatBiTree(BiTree *t)
{
TElemType ch;
scanf("%c",&ch);
if(ch!='#'){
(*t)=(BiNode*)malloc(sizeof(BiNode));
(*t)->date=ch;
(*t)->ltag=0;
(*t)->rtag=0;
CreatBiTree(&(*t)->lchild);
CreatBiTree(&(*t)->rchild);
}
else (*t)=NULL;
}
int InOrderTraverse(BiTree *t,BiTree *pre)
{
if((*t)){
InOrderTraverse(&(*t)->lchild,&(*pre));
if((*t)->lchild==NULL){
(*t)->ltag=1;
(*t)->lchild=*pre;
}
if((*pre)->rchild==NULL){
(*pre)->rtag=1;
(*pre)->rchild=*t;
}
pre=t;
InOrderTraverse(&(*t)->rchild,&(*pre));
}
else return ;
}
int Traverse(BiTree t)
{
BiNode *p;
p=t->lchild;
while(p!=NULL){
printf("%c ",p->date);
if(p->rtag==1) p=p->rchild;
if(p->ltag==0) p=p->lchild;
}
}
int main()
{
BiTree T1,T=NULL,Pre=NULL;
InitBiTree(&T1);
Pre=T1;
T1->lchild=T;
CreatBiTree(&T);
InOrderTraverse(&T,&Pre);
Pre->rtag=1;
Pre->rchild=T1;
Traverse(T1);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef struct BiNode{
struct BiNode *lchild,*rchild;
int ltag,rtag;
TElemType date;
}BiNode,*BiTree;
int InitBiTree(BiTree *t)
{
(*t)=(BiNode*)malloc(sizeof(BiNode));
if(!(*t)) return 0;
(*t)->lchild=NULL;
(*t)->rchild=NULL;
(*t)->date='\0';
(*t)->ltag=0;
(*t)->rtag=0;
}
int CreatBiTree(BiTree *t)
{
TElemType ch;
scanf("%c",&ch);
if(ch!='#'){
(*t)=(BiNode*)malloc(sizeof(BiNode));
(*t)->date=ch;
(*t)->ltag=0;
(*t)->rtag=0;
CreatBiTree(&(*t)->lchild);
CreatBiTree(&(*t)->rchild);
}
else (*t)=NULL;
}
int InOrderTraverse(BiTree *t,BiTree *pre)
{
if((*t)){
InOrderTraverse(&(*t)->lchild,&(*pre));
if((*t)->lchild==NULL){
(*t)->ltag=1;
(*t)->lchild=*pre;
}
if((*pre)->rchild==NULL){
(*pre)->rtag=1;
(*pre)->rchild=*t;
}
*pre=*t;
InOrderTraverse(&(*t)->rchild,&(*pre));
}
else return ;
}
int In(BiTree *t1,BiTree *t,BiTree *pre)
{
(*t1)->ltag=1;
if(!(*t)) (*t1)->lchild=(*t1);
else{
(*t1)->lchild=(*t);
(*pre)->rtag=1;
(*pre)->rchild=(*t1);
}
}
int Traverse(BiTree t)
{
BiNode *p;
p=t->lchild;
while(p!=t){ //空树或遍历结束时,p==T
while(p->ltag==0) //沿左孩子向下
p=p->lchild; //访问其左子树为空的结点
printf("%c ",p->date);
while(p->rtag==1&&p->rchild!=t){
p=p->rchild; //沿右线索访问后继结点
printf("%c ",p->date);
}
p=p->rchild;
}
}
int main()
{
BiTree T1,T=NULL,Pre=NULL;
InitBiTree(&T1);
Pre=T1;
CreatBiTree(&T);
InOrderTraverse(&T,&Pre);//中序线索二叉树的建立
In(&T1,&T,&Pre);//将首元节点加入
Traverse(T1);
return 0;
}
你现在测试有什么不正常现象啊?
把这个函数的前几行,改成这样的,你试试看
int CreatBiTree(BiTree *t)
{
TElemType ch;
scanf("%c",&ch);
getchar();