请帮忙看一下我这个二叉树的线索化哪里出错了,谢谢(在线等)。

wjvonline 2005-03-03 10:50:13
我按中序进行线索化并输出,但好象线索化时出了点问题,有些结点没有如我所想的在标志域赋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;
}
...全文
124 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tudou614 2005-03-11
  • 打赏
  • 举报
回复
GZ
wjvonline 2005-03-04
  • 打赏
  • 举报
回复
找到原因了:

//前件线索化
if ( p->lchild==NULL )
{
p->lflag = 1;
p->lchild = pre;
}
//后件线索化
if ( pre->rchild==NULL )
{
pre->rflag = 1;
pre->rchild = p;
}

我没有定义当结点有前后件时flag的值为0,而在show(struct btnode *T)里面却这样定义:
while ( p->lflag==0 )
p = p->lchild;
printf("%d\n", p->d);

呵呵,太粗心了:)
wjvonline 2005-03-03
  • 打赏
  • 举报
回复
哦,好嘛,麻烦了
wjvonline 2005-03-03
  • 打赏
  • 举报
回复
不啊,我试了的是指向根结点,但前后件指针没有指向任何对象,你输入1,2,0,0,3,0,0
看是不是输出的1嘛
zengwujun 2005-03-03
  • 打赏
  • 举报
回复
根节点的指向有问题

我不看了,太累了,好长时间没看过这种东西了
zengwujun 2005-03-03
  • 打赏
  • 举报
回复
void show(struct btnode *T)
{
struct btnode *p;

p = T->lchild; //指向根结点
cout << "first node:"<<p->d;<--测试根节点

我发现并没有输出根节点的值,就是说p并没有指向根节点
wjvonline 2005-03-03
  • 打赏
  • 举报
回复
我就是说线索化时不知哪错了,你改的SHOW()是按前序输出,而我想将树线索化后再按线索输出
zengwujun 2005-03-03
  • 打赏
  • 举报
回复
把show函数改为
void show(btnode *T)
{
if(T==NULL)return;

printf("%d\n",T->d);
show(T->lchild);
show(T->rchild);
}
主函数改为
int main()
{
struct btnode *m, *top, *test;
m = new btnode;
int n = 0;
top = creatbt(m,n);
//test = InOrderThreading(top);
//show(test);
show(top);
return 0;
}

输入1 2 0 4 5 0 7 0 0 0 0
那么输出为1,2,4,5,7
证明你的创建函数没有错
错误存在于InOrderThreading或者InThreading函数
wjvonline 2005-03-03
  • 打赏
  • 举报
回复
我用0来代表空子树,比如有
1
2 3
这样一颗树,那就输入1,2,0,0,3,0,0

您觉得该怎样改进呢?
zengwujun 2005-03-03
  • 打赏
  • 举报
回复
你这个creatbt的函数,要输好多个0才能退出来呀,每退一层递归就要输入一个0

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧