主题:线索二叉树,请求指教、释疑解惑
问题描述如下:
建立一个二叉链表,用中序遍历输出节点的值、节点的左右孩子指针的值、节点的左右线索标志的值;然后把二叉链表中序线索化,线索化以后,然后再用中序遍历输出节点的值、左右指针的值以及左右线索标志的值。按照理解,线索化以后,二叉链表内的空指针域应该应该不在是空值,应该指向前驱或者后继节点。然后,运行结果表明,线索化以后节点的空指针域仍然为空!
附源程序(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;
}
建立一个二叉链表,用中序遍历输出节点的值、节点的左右孩子指针的值、节点的左右线索标志的值;然后把二叉链表中序线索化,线索化以后,然后再用中序遍历输出节点的值、左右指针的值以及左右线索标志的值。按照理解,线索化以后,二叉链表内的空指针域应该应该不在是空值,应该指向前驱或者后继节点。然后,运行结果表明,线索化以后节点的空指针域仍然为空!
附源程序(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;
}