请帮忙看一下我这个二叉树的线索化哪里出错了,谢谢(在线等)。
我按中序进行线索化并输出,但好象线索化时出了点问题,有些结点没有如我所想的在标志域赋0或1,请大家在您的机器上试试,看看我哪里错了,非常感谢!
#include "stdlib.h"
#include "stdio.h"
struct btnode
{
int d;
int lflag, rflag; //值为0时有后件,为1时设置线索
struct btnode *lchild;
struct btnode *rchild;
};
struct btnode *pre; //pre始终指向刚刚访问过的结点
//生成树
creatbt(pt, k)
{
int x;
struct btnode *p, *root, *q;
q = pt;
printf("input>>");
scanf("%d",&x);
if ( x!=0 )
{
p = (struct btnode *)malloc(sizeof(struct btnode));
p->d = x; p->lchild = NULL; p->rchild = NULL;
if ( k == 0 ) //设置根结点
root = p;
if ( k == 1 ) //设置左孩子
q->lchild = p;
if ( k == 2 ) //设置右孩子
q->rchild = p;
creatbt(p,1);
creatbt(p,2);
}
return(root);
}
void InThreading(struct btnode *p)
{
if ( p!=NULL )
{
InThreading(p->lchild);
//前件线索化
if ( p->lchild==NULL )
{
p->lflag = 1;
p->lchild = pre;
}
//后件线索化
if ( pre->rchild==NULL )
{
pre->rflag = 1;
pre->rchild = p;
}
pre = p; //保持pre指向p的前驱
InThreading(p->rchild);
}
}
InOrderThreading(T)
{
struct btnode *head;
head = (struct btnode *)malloc(sizeof(struct btnode));
head->lflag = 0; head->rflag = 1; //建立头结点
head->rchild = head; //头结点右指针回指
if ( T==NULL ) //若二叉树为空,头结点左指针回指
head->lchild = head;
else
{
head->lchild = T; pre = head;
InThreading(T); //中序遍历进行中序线索化
pre->rchild = head; pre->rflag = 1;//对最后一个结点线索化
head->rchild = pre;
}
return head;
}
//遍历输出
void show(struct btnode *T)
{
struct btnode *p;
p = T->lchild; //指向根结点
while ( p!=T )
{
while ( p->lflag==0 )
p = p->lchild;
printf("%d\n", p->d);
while ( p->rflag==1 && p->rchild!=T )
{
p = p->rchild;
printf("%d\n", p->d);
}
p = p->rchild;
}
return;
}
int main()
{
struct btnode *m, *top, *test;
int n = 0;
top = creatbt(m,n);
test = InOrderThreading(top);
show(test);
return 0;
}