数据结构树和森林实验报告

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

树和森林应用实验

实验报告

实验目的

(1)掌握树和森林的二叉链表表示方法。

(2)掌握树和二叉树的结构及算法之间的对应关系。

(3)掌握树的两种遍历算法及其应用。

实验运行环境

Visual C++

实验任务

为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"trees.h"中的函数的形式给出,并假设该库函数中定义了树指针和结点类型分别为tree和tnode,以及部分常用运算,例如构建树(森林)、以某种方式显示树和森林等。各运算的名称较为直观,因而易于理解。读者可自行设计自己的库函数,也可到作者的网站下载。

说明2:为便于数据的描述,和前面的实验一样,将测试数据结构列出,并以一个文件名的形式给出标注,例如测试数据名为tree1.tre的树,其具体结构形式参见附录中的树列表中的标有tree1.tre的树。

实验内容

第一题:

<1>将一棵树(或森林)转换为二叉树。

实验测试数据基本要求:

第一组数据:tree1.tre

第二组数据:tree2.tre

实验准备:

用广义表来表示树的数据,保存到文件中,通过文件流来读入数据,并根据读入的数据来创建树

第二题:

<2>求森林的高度。

实验测试数据基本要求:

第一组数据:tree1.tre

第二组数据:tree2.tre

第一组数据:full41.cbt

第二组数据:letter.cbt

实验准备:

遍历每一棵树,寻找高度的最大值。可以设立一个私有成员来记录数的高度。

第三题:

<3>按层次方式遍历森林。

实验测试数据基本要求:

第一组数据:tree1.tre

第二组数据:tree2.tre

实验准备:

先访问第一层结点,并将它放入队列中,并反复从队列中取结点,访问其孩子结点,直至访问到叶子结点。

第四题:

<4>输出一个森林中每个结点的值及其对应的层次数。

实验测试数据基本要求:

第一组数据:tree1.tre

第二组数据:tree2.tre

实验准备:

使用递归函数来访问森林,同时输出层次数及结点值,使用形参来传递当前层次数

第五题:

<5>输出一个森林的广义表形式,如下图中的森林的输出为:

(a(b(c,d,e,f),g(h,i,j),k(l,m,n)),o(p(q)),r(s(t(u)),v(w(x,y,z))))

实验测试数据基本要求:

第一组数据:tree1.tre

第二组数据:tree2.tre

实验准备:

使用递归函数调用,若当前节点有左孩子,则先输出‘(’再访问下一节点,若当前节点的右指针不为空,则先输出‘,’再访问下一结点。

实验测试数据

实验程序

#include

using namespace std;

typedef char ElemType;

#define MAX 200

typedef struct CSNode

{

ElemType data;

struct CSNode *firstchild , *nejtsibling ;

}

CSNode , *CSTree;

typedef struct BTNode

{

ElemType data;

struct BTNode *lchild , *rchild ;

} BTNode,*BTree;

class FOREST

{

public :

FOREST();

CSTree returnT(); //输出森林的根结点BTree returnBT(); //输出森林的根结点CSTree creat(CSTree &T); //创建森林BTree change(CSTree &T,BTree &BT1); //将森林转换成为二叉树void first(CSTree &T,int i);

//第一题:按照先序遍历的方式来输出树林每个结点的值以及层次

void second(CSTree &T); //第五题:输出一个森林的广义表形式

void third(const CSTree &T); //第三题:按层次方式遍历森林。

void fourth(BTree &BT); //第四题:按照先序遍历的方式来输出二叉树每个结点的值int higth(const CSTree &T); //第二题:求森林的高度

private :

CSTree T; //森林的头结点

BTree BT; //二叉树的头结点

int high; //森林的高度

} ;

FOREST :: FOREST()

{

high = 0;

T = NULL;

BT = NULL;

}

CSTree FOREST :: returnT()

{

return T;

}

BTree FOREST :: returnBT()

{

return BT;

}

CSTree FOREST :: creat(CSTree &T)

{

int a ,b;

T = new CSNode;

cin>>T->data>>a>>b;

if(a == 1) T->firstchild = NULL;

else creat(T->firstchild);

if(b == 1) T->nejtsibling = NULL;

else creat(T->nejtsibling);

return T;

}

BTree FOREST :: change(CSTree &T,BTree &BT) {

if(!T) { BT = NULL; return NULL; }

BT = new BTNode;

BT -> data = T -> data;

if(!T->firstchild) BT->lchild = NULL;

else change(T->firstchild,BT->lchild);

if(!T->nejtsibling) BT->rchild = NULL;

else change(T->nejtsibling,BT->rchild); return BT;

}

void FOREST :: first(CSTree &T,int i)

{

if(!T) return ;

cout<data<<" "<

相关文档
最新文档