二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验题目二叉树构造及遍历

实验地点U408 实验时间2012年11月6日

一、实验目的

1.掌握二叉树的线索化及其应用

2.掌握构造哈夫曼树及哈夫曼编码

二、实验环境(本实验的硬件和软件环境)

1)PC机;

2)Windows XP以上版本的操作系统;

3)Visual Studio 2010以上版本的开发工具;

三、实验实现过程

1.补充下列程序,使该程序能正确运行,验证上述的选择题的结果:

题目要求:由先序遍历序列建立二叉树的二叉链表,中序线索化二叉树并找出结点的前驱和后继。

步骤一:新建工程,新建一个头文件,命名为 thread.h,一个源文件命名为thread.cpp

步骤二:

在thread.h中编辑代码,代码如下:

#include

using namespace std;

typedef char DataType;

typedef struct Node

{

DataType data;

int Ltag;

int Rtag;

struct Node *LChild; /*填空1、指针域的数据类型*/

struct Node *RChild;

}BTNode;

BTNode *pre;

void CreateBiTree(BTNode *&root, DataType Array[]) ; //创建初始化二叉树

void Inthread(BTNode *root); //实现中序线索二叉树

BTNode * InPre(BTNode *p); //求中序线索二叉树结点的前驱

BTNode * InNext(BTNode * p) ; //求中序线索二叉树结点的后驱

在Thread.cpp中编辑代码,代码如下:

#include “thread.h”/*11、填空:请填空:包含头文件*/

typedef char DataType;

void CreateBiTree(BTNode *&root, DataType Array[])

{

static int count=0; //静态变量count

char item=Array[count];//读取Array[]数组中的第count个元素

count++;

if(item == '#') //如果读入#字符,创建空树

{ root = NULL; return ;}

else

{

root =new Node;/*填空3:生成一个新结点*/

root->data= item; /*填空4:将ch做为新结点的数据域的值*/

root->Ltag=0;

root->Rtag=0;

CreateBiTree(root->LChild, DataType Array[]); /*填空5: 递归的方法,生成左子树,注意实参的表示方法*/

CreateBiTree(root->RChild, DataType Array[]); /*填空6: 递归的方法,生成右子树,注意实参的表示方法*/

}

}

void Inthread(BTNode *root)

/* 对root所指的二叉树进行中序线索化,其中pre始终指向刚访问过的结点,其初值为NULL */

{

if (root!=NULL)

{

Inthread(root->LChild); /* 线索化左子树*/

if (root->LChild==NULL)

{

root->Ltag=1;

root-> LChild =pre; /*填空7-8:置前驱线索*/

}

if (pre!=NULL&& pre->RChild==NULL) /* 填空9-10:置后继线索*/

{

pre->Rtag=1;

root-> RChild =pre;

}

pre=root;

Inthread(root->RChild); /*线索化右子树*/

}

}

/* 在中序线索二叉树中查找p的中序前驱, 并用pre指针返回结果*/ BTNode * InPre(BTNode *p)

{

BTNode *q;

if(p->Ltag==1)

pre = p->LChild; /*填空13:直接利用线索找前驱*/

else

{ /* 填空14-15:在p的左子树中查找"最右下端"结点*/

for(q = p->LChild;q->Rtag==1;q=q->RChild);

pre=q;

}

return(pre);

}

/*在中序线索二叉树中查找p的中序后继结点,并用next指针返回结果*/ BTNode * InNext(BTNode * p)

{

BTNode *Next;

BTNode *q;

if (p->Rtag==1)

Next = p->RChild; /*填空16:直接利用线索*/

else

{ /*填空17-18:在p的右子树中查找"最左下端"结点*/

for(q=p->RChild; q->Ltag==1 ;q=q->LChild);

Next=q;

}

return(Next);

}

void main()

{

BTNode *root,*q;

DataType A[]="AB#CD##E##F#G##";//以"#"补充空分支后的某个遍历序列CreateBiTree(root,A);//以前序遍历序列建立二叉树

pre = NULL;

相关文档
最新文档