主题:中序线索二叉树实现
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include <stdlib.h>
#include <conio.h>
#define link 0
#define thread 1
typedef struct bithrnode
{
char data;
struct bithrnode *lchild,*rchild;
int ltag,rtag;
}bithrnode,*bithrtree;
bithrtree pre;
creatbitree(bithrnode **t)
{
char x;
scanf("%c",&x);
//fflush(stdin);
if(x=='#') (*t)=NULL;
else
{
//if(!((*tr)=(struct bithrnode *) malloc(sizeof(struct bithrnode)))) exit(OVERFLOW);
(*t)=(struct bithrnode *) malloc (sizeof(struct bithrnode));
(*t)->data=x;
creatbitree(&((*t)->lchild));
creatbitree(&((*t)->rchild));
}
}
pritorder(bithrtree tp)
{
if(tp!=NULL)
{
pritorder(tp->lchild);
printf("%c,%d,%d\n",tp->data,tp->ltag,tp->rtag);
pritorder(tp->rchild);
}
else return EOF;
}
inorderthr(bithrnode **thrt,bithrtree y)
{
//(*thrt)=(struct bithrnode *) malloc (sizeof(struct bithrnode));
(*thrt)->ltag=link;
printf("%d",(*thrt)->ltag);
(*thrt)->rtag=thread;
(*thrt)->rchild=(*thrt);
if(y==NULL) (*thrt)->lchild=(*thrt);
else
{
(*thrt)->lchild=y;
pre=(*thrt);
inthreading(y);
pre->lchild=(*thrt);
pre->rtag=thread;
(*thrt)->rchild=pre;
}
}
inthreading(bithrtree p)
{
if(p)
{
inthreading(p->lchild);
if(!p->lchild)
{
//printf("%c,%d,%d\n",p->data,p->ltag,p->rtag);
p->ltag=thread;
p->lchild=pre;
//printf("%c,%d,%d\n",p->data,p->ltag,p->rtag);
}
if(!p->rchild)
{
pre->rtag=thread;
pre->rchild=p;
//printf("%c,%d,%d\n",p->data,p->ltag,p->rtag);
}
pre=p;
inthreading(p->rchild);
}
}
inordertraverse(bithrnode *z)
{
bithrtree p;
while(p!=z)
{
while(p->ltag==link)
{
p=p->lchild;
}
//if(p->data=NULL) return EOF;
while(p->rtag==thread && p->rchild!=z)
{
p=p->rchild;
printf("%c",p->data);
}
p=p->rchild;
}
}
TreeEmpty(bithrtree y)
{ // 初始条件: 树T存在。操作结果: 若T为空树,则返回TURE,否则返回FALSE
if(y) // T不空
return -1; //flase
else
return 999;//true
}
main()
{
bithrtree t;
bithrnode *thrt;
thrt=(struct bithrnode *) malloc (sizeof(struct bithrnode));
printf("Input the bitree:\n");
creatbitree(&t);
pritorder(t);
inorderthr(&thrt,t);
inordertraverse(thrt);
}
[em18]
各位这个程序,在最后中序线索时,无法显示结果,实在是很奇怪!!!!求救
#include<string.h>
#include<malloc.h>
#include <stdlib.h>
#include <conio.h>
#define link 0
#define thread 1
typedef struct bithrnode
{
char data;
struct bithrnode *lchild,*rchild;
int ltag,rtag;
}bithrnode,*bithrtree;
bithrtree pre;
creatbitree(bithrnode **t)
{
char x;
scanf("%c",&x);
//fflush(stdin);
if(x=='#') (*t)=NULL;
else
{
//if(!((*tr)=(struct bithrnode *) malloc(sizeof(struct bithrnode)))) exit(OVERFLOW);
(*t)=(struct bithrnode *) malloc (sizeof(struct bithrnode));
(*t)->data=x;
creatbitree(&((*t)->lchild));
creatbitree(&((*t)->rchild));
}
}
pritorder(bithrtree tp)
{
if(tp!=NULL)
{
pritorder(tp->lchild);
printf("%c,%d,%d\n",tp->data,tp->ltag,tp->rtag);
pritorder(tp->rchild);
}
else return EOF;
}
inorderthr(bithrnode **thrt,bithrtree y)
{
//(*thrt)=(struct bithrnode *) malloc (sizeof(struct bithrnode));
(*thrt)->ltag=link;
printf("%d",(*thrt)->ltag);
(*thrt)->rtag=thread;
(*thrt)->rchild=(*thrt);
if(y==NULL) (*thrt)->lchild=(*thrt);
else
{
(*thrt)->lchild=y;
pre=(*thrt);
inthreading(y);
pre->lchild=(*thrt);
pre->rtag=thread;
(*thrt)->rchild=pre;
}
}
inthreading(bithrtree p)
{
if(p)
{
inthreading(p->lchild);
if(!p->lchild)
{
//printf("%c,%d,%d\n",p->data,p->ltag,p->rtag);
p->ltag=thread;
p->lchild=pre;
//printf("%c,%d,%d\n",p->data,p->ltag,p->rtag);
}
if(!p->rchild)
{
pre->rtag=thread;
pre->rchild=p;
//printf("%c,%d,%d\n",p->data,p->ltag,p->rtag);
}
pre=p;
inthreading(p->rchild);
}
}
inordertraverse(bithrnode *z)
{
bithrtree p;
while(p!=z)
{
while(p->ltag==link)
{
p=p->lchild;
}
//if(p->data=NULL) return EOF;
while(p->rtag==thread && p->rchild!=z)
{
p=p->rchild;
printf("%c",p->data);
}
p=p->rchild;
}
}
TreeEmpty(bithrtree y)
{ // 初始条件: 树T存在。操作结果: 若T为空树,则返回TURE,否则返回FALSE
if(y) // T不空
return -1; //flase
else
return 999;//true
}
main()
{
bithrtree t;
bithrnode *thrt;
thrt=(struct bithrnode *) malloc (sizeof(struct bithrnode));
printf("Input the bitree:\n");
creatbitree(&t);
pritorder(t);
inorderthr(&thrt,t);
inordertraverse(thrt);
}
[em18]
各位这个程序,在最后中序线索时,无法显示结果,实在是很奇怪!!!!求救