大数据结构实验实现中序线索化二叉树构造哈夫曼树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称数据结构
实验项目名称实现中序线索化二叉树,构造哈夫曼树班级与班级代码
实验室名称(或课室)SS1-204
专业软件工程
任课教师
学号:
姓名:
实验日期:2011年11 月18 日
商学院教务处制
实验报告成绩
评价:
指导教师(签名)
2011 年月日说明:指导教师评分后,实验报告交院(系)办公室保存。
实验题7.5实现中序线索化二叉树
/*文件名:exp7-5.cpp*/
#include
#include
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data;
int ltag,rtag; /*增加的线索标记*/
struct node *lchild;
struct node *rchild;
} TBTNode;
void CreateTBTNode(TBTNode * &b,char *str)
{
TBTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL; /*建立的二叉树初始时为空*/
ch=str[j];
while (ch!='\0') /*str未扫描完时循环*/
{
switch(ch)
{
case '(':top++;St[top]=p;k=1; break; /*为左结点*/
case ')':top--;break;
case ',':k=2; break; /*为右结点*/
default:p=(TBTNode *)malloc(sizeof(TBTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if (b==NULL) /**p为二叉树的根结点*/
b=p;
else /*已建立二叉树根结点*/
{
switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
void DispTBTNode(TBTNode *b)
{
if (b!=NULL)
{
printf("%c",b->data);
if (b->lchild!=NULL || b->rchild!=NULL)
{
printf("(");
DispTBTNode(b->lchild);
if (b->rchild!=NULL) printf(",");
DispTBTNode(b->rchild);
printf(")");
}
}
}
TBTNode *pre; /*全局变量*/
void Thread(TBTNode *&p)
{
if (p!=NULL)
{
Thread(p->lchild); /*左子树线索化*/
if (p->lchild==NULL) /*前驱线索*/
{
p->lchild=pre; /*建立当前结点的前驱线索*/
p->ltag=1;
}
else p->ltag=0;
if (pre->rchild==NULL) /*后继线索*/
{
pre->rchild=p; /*建立前驱结点的后继线索*/
pre->rtag=1;
}
else pre->rtag=0;
pre=p;
Thread(p->rchild); /*右子树线索化*/
}
}
TBTNode *CreaThread(TBTNode *b) /*中序线索化二叉树*/
{
TBTNode *root;
root=(TBTNode *)malloc(sizeof(TBTNode)); /*创建根结点*/
root->ltag=0;root->rtag=1;
root->rchild=b;
if (b==NULL) /*空二叉树*/
root->lchild=root;
else
{
root->lchild=b;
pre=root; /*pre是*p的前驱结点,供加线索用*/
Thread(b); /*中序遍历线索化二叉树*/
pre->rchild=root; /*最后处理,加入指向根结点的线索*/
pre->rtag=1;
root->rchild=pre; /*根结点右线索化*/
}
return root;
}
void ThInOrder(TBTNode *tb)
{
TBTNode *p=tb->lchild; /*指向根结点*/
while (p!=tb)
{
while (p->ltag==0) p=p->lchild;
printf("%c ",p->data);
while (p->rtag==1 && p->rchild!=tb)
{
p=p->rchild;
printf("%c ",p->data);
}
p=p->rchild;
}
}
void main()
{
TBTNode *b,*tb;
CreateTBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
printf(" 二叉树:");DispTBTNode(b);printf("\n");
tb=CreaThread(b);
printf(" 线索中序序列:");ThInOrder(tb);printf("\n");
}
结果截图: