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