回 帖 发 新 帖 刷新版面

主题:线索二叉树,请求指教、释疑解惑

问题描述如下:
建立一个二叉链表,用中序遍历输出节点的值、节点的左右孩子指针的值、节点的左右线索标志的值;然后把二叉链表中序线索化,线索化以后,然后再用中序遍历输出节点的值、左右指针的值以及左右线索标志的值。按照理解,线索化以后,二叉链表内的空指针域应该应该不在是空值,应该指向前驱或者后继节点。然后,运行结果表明,线索化以后节点的空指针域仍然为空!
附源程序(turo c 中文版调试),苦恼了半月,始终解决不了了,求救。
#include <stdio.h>
#include <stdlib.h>
#define maxsize 50
typedef char datatype;
typedef struct node
{
datatype data;
int rtag,ltag;
struct node *lchild,*rchild;
}bitree;


bitree *Q[maxsize];


bitree *CREATREE()
{
char ch;
int front,rear;/*队头队尾指针*/
bitree *root,*s;
root=NULL;/*置空二叉树*/
front=1;rear=0;/*置空队列*/
printf("请输入字符型的结点数据:\n");
ch=getchar();/*输入第一个结点*/
while (ch!='#')
/*判断是否为结束*/
{s=NULL;
if(ch!='@')/*@表示虚结点*/
{s=malloc(sizeof(bitree));
s->data=ch;
s->lchild=NULL;
s->rchild=NULL;
s->rtag=0;
s->ltag=0;
}
rear++;
Q[rear]=s;/*将虚结点指针NULL或新结点入队*/
if(rear==1) root=s;/*第一个为根结点*/
else
{ if(s&&Q[front])/*孩子和双亲都不是虚*/
if(rear%2==0) Q[front]->lchild=s;
/*rear为偶数,新结点是左孩子*/
else
Q[front]->rchild=s; /*新结点为右孩子*/
if(rear%2==1) front ++;
/*结点Q[front]的两个孩子已处理完毕,出队*/
}
ch=getchar();
}
return root;/*返回根指针*/
}


/*中序遍历二叉树*/
void INORDER(t)
bitree *t;
{
if(t)
{
INORDER(t->lchild);/*中序遍历*t的左子树*/
printf("%c\t%d\t%d\tltag=%d\trtag=%d\n ",t->data,t->lchild,t->rchild,t->ltag,t->rtag);/*访问结点*/
INORDER(t->rchild);/*中序遍历*t的右子树*/
}
}

/*将二叉树p中序线索化,线索标志初始为0*/

void INTHREAD(bitree *p)
{
bitree *pre;
pre=NULL;
if (p!=NULL)
 {
  INTHREAD(p->lchild);/*左子数线索化*/
 { if(p->lchild==NULL) p->ltag=1;  /*建立左线索标记*/
  if(p->rchild==NULL) p->rtag=1;  /*建立右线索标记*/
  if(pre!=NULL)
  {
  if(pre->rtag==1) /* *pre无右子树*/
  pre->rchild=p;   /*右线索pre->rchild 指向p*/
  if(p->ltag==1)  /* *p无左子树*/
  p->lchild=pre;
  }
pre=p;
}
INTHREAD(p->rchild); /*右子树线索化*/
}}



/*测试主程序*/
main()
{
int i;
bitree *btree;
btree=CREATREE();
printf("\n中序遍历的结果为:\n");
INORDER(btree);
printf("\n******************\n");


INTHREAD(btree);
printf("\n线索化完毕\n");

printf("\n中序遍历的结果为\n");
INORDER(btree);
getch();
return 0;
}

回复列表 (共2个回复)

沙发

你的问题是:bitree *pre;是局部变量,它的值没有被上层得到。每层的pre都是空值

板凳

pre没有定义成全局变量,的确是错了。
另外,把pre定义成全局变量以后,中序遍历线索后的二叉树就成了死循环。
是因为,线索二叉树不能用前面的递归算法进行遍历(其前提是t=NLL结束,线索二叉树不满足这个条件),所以必须自己另编中序遍历算法。

我来回复

您尚未登录,请登录后再回复。点此登录或注册