最近刚学习到数据结构第五章树和二叉树,在线索二叉树这,程序作前序输入,中序输出的时候,输出结果仅有左子树的结点值或者会死循环,没有根节点和右子树的输出,一直不知道错在哪里,自己看自己的代码真是开不出来,用的DEV写的代码。
第一次用博客问问题,格式不会改,直接复制就可以了。有没有大佬帮忙看一下下!!!感激!!
enum PointerTag{Link,Thread};
//link=0代表存在孩子结点,Thread=1代表线索
//线索二叉树的存储结构
typedef struct BiThrNode{
TElemType data;
struct BiThrNode lchild,rchild;
PointerTag LTag,RaTag;
//标记 L(R)Tag:0->结点的左(右)孩子 1->结点的前驱(后继)
}BiThrNode,*BiThrTree;
//全局变量指针pre,指向刚刚访问过的结点
BiThrTree pre=NULL;
//线索二叉树的创建
void Creat(BiThrTree &T){
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
T=new BiThrNode;
T->data=ch;
T->LTag=Link;
T->RTag=Link; //先序创建
Creat(T->lchild);
Creat(T->rchild);
}
}
//二叉树的中序线索化
线索化:将树的非线性化存储结构转化为线性存储结构
//以结点p为根的子树线索化
空链域:由n个结点的二叉树必定存在n+1个空链域,用空链域来存放线索二叉树结点的前驱和后继信息 注:空链域就是叶子结点的左右结点,它们必定为空。
void InThreading(BiThrTree p){
//二叉树构造的实质:将二叉链表中的空指针改为指向前驱或后继的线索 ,在遍历的过程中修改空指针
//指针p指向当前访问的结点;指针pre指向刚刚访问过的结点
if(p){
InThreading(p->lchild);
if(!p->lchild){
p->LTag=Thread;
p->lchild=pre;
}
else p->LTag=Link;
if(!pre->rchild){
pre->RTag=Thread;
pre->rchild=p;
}
else pre->RTag=Link;
pre=p;
InThreading(p->rchild);
}
}
//带头结点的二叉树线索化
void InOrderThreading(BiThrTree &Thrt,BiThrTree T){
Thrt=new BiThrNode;
Thrt->LTag=Link;
Thrt->RTag=Thread;
Thrt->rchild=Thrt;
if(!T) Thrt->lchild=Thrt;
else
{
Thrt->lchild=T;
pre=Thrt;
InThreading(T); //线索化
pre->rchild=Thrt; //中序最后一个结点线索化
pre->RTag=Thread;
Thrt->rchild=pre;
}
}
//中序遍历线索二叉树
void InOrderTraverse_Thr(BiThrTree Thrt){
BiThrTree p; //创建头节点,指向二叉树的根节点
p=Thrt->lchild;
while(p!=Thrt){
while(p->LTag==Link)
p=p->lchild;
printf("%c",p->data);
//!!这里改为p->rchild!=NULL,输出结果正确但是无法终止循环。
while(p->RTag==Thread&&p->rchild!=Thrt)
{
p=p->rchild;
printf("%c",p->data);
}
p=p->rchild;
}
}
int main(){
BiThrTree T,Thrt;
printf("请前序输入二叉树的结点值,'#'代表空结点:\n");
Creat(T);
InOrderThreading(Thrt,T);
InOrderTraverse_Thr(T);
}