什么样的人适合穿旗袍:帮忙调个程序吧(二叉树线索化)

来源:百度文库 编辑:高考问答 时间:2024/05/10 09:02:51
#include <stdio.h>
#include <iostream.h>
#include <malloc.h>
#include<stdlib.h>
typedef char DataType;/*定义DataType类型*/
typedef enum {Link,Thread}PointerTag;
typedef struct node{
DataType data;
struct node *lchild, *rchild;/*左右孩子子树*/
PointerTag LTag,RTag;
}BiThrNode; /*结点类型*/

typedef BiThrNode *BiThrTree ;/*二叉树类型*/

void CreatBinTree(BiThrTree T)
{ /*构造二叉链表,注意:输入序列是先序序列*/
char ch;
if ((ch=getchar())=='/')
T=NULL;
else{ /*读入非空格*/
T=(BiThrTree )malloc(sizeof(BiThrNode));/*生成结点*/
(T)->data=ch;(T)->LTag=Link;(T)->RTag=Link;
CreatBinTree((T)->lchild); /*构造左子树 */
CreatBinTree((T)->rchild); /*构造右子树*/
}
}
BiThrTree pre;/*全局变量*/

void InThreading(BiThrTree p)
{
if(p)
{
InThreading(p->lchild);/*左子树线索化*/
if(!p->lchild)

{p->LTag=Thread;p->lchild=pre;}/*前驱线索*/
if(!pre->rchild)

{pre->RTag=Thread;pre->rchild=p;}/*后继线索*/

pre=p;/*保持pre指向p*/
InThreading(p->rchild);/*右子树线索化*/
}
}

int InOrderThreading(BiThrTree Thrt,BiThrTree T)
/*中序遍厉二叉树T,并将其中序线索化,Thrt指向头结点*/
{ if(!(Thrt=(BiThrTree)malloc(sizeof(BiThrNode)))) exit(0);
(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;
}
return 1;
}

int print(BiThrTree e)
{printf("%d %c %d\n",e->LTag,e->data,e->RTag);return 1;}

int InOrderTraverse(BiThrTree T,int (* visit)(BiThrTree e))
/*T指向头结点,头结点的左链lchild指向根结点,中序遍厉二叉树*/
{BiThrTree p;
p=T->lchild;/*p指向根结点*/
while(p!=T)/*空树或遍厉结束时,p==T*/
{while(p->LTag==Link)
p=p->lchild;
cout<<p->data<<endl; /*打印*/
while(p->RTag==Thread&&p->rchild!=T)
{p=p->rchild;cout<<p->data<<endl;}/*访问后继结点*/
p=p->rchild;
}
return 1;
}

void main()
{ /*测试程序*/
BiThrTree T,Thrt;
CreatBinTree(T);
InOrderThreading(Thrt,T);
InOrderTraverse(Thrt,print);
}
/*可输入"sffh///sf/s//fd/g///"来测试(注意/)*/
构造函数creat()是没错的!

错误太多了,主要是指针的用法和参数传递方面的问题.
1.函数参数用法错.函数既然定义成
void CreatBinTree(BiThrTree T)
那么为什么调用时用了CreatBinTree((T)->lchild); 和CreatBinTree((T)->rchild);
这说明你本意是把函数定义成void CreatBinTree(BiThrTree *T)
同样还有函数int InOrderThreading(BiThrTree Thrt,BiThrTree T) 和int InOrderTraverse(BiThrTree T,int (* visit)(BiThrTree e)) 都有问题.

2.全局变量pre定义错误:应该是
BiThrTree *pre;