大数据结构实验实现中序线索化二叉树构造哈夫曼树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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");

}

结果截图:

相关文档
最新文档