树和二叉树实验

树和二叉树实验

实验题目:二叉树的实现

一、 实验目的

(1)掌握二叉树的逻辑结构;

(2)掌握二叉树的二叉链表存储结构;

(3)验证二叉树的二叉链表存储及遍历操作

二、 实验内容:

(1)建立一颗含有 n 个节点的二叉树,采用二叉链表存储

(2)输出前序、中序和后序遍历该二叉树的遍历结构

三、 设计与编码

1. 本实验用到的理论知识

(1)二叉树的存储结构:二叉链表;

(2)二叉树的四种遍历操作:前序、中序、后序和层序遍历;

2. 算法设计:

(1)二叉树的建立:用递归的方法,先递归建立根结点的左子树,再递归建立根结点

的右子树;

(2)二叉树的遍历操作:四种,均用到递归。

3. 编码

//Bitree.h

#ifndef BiTree_H

#define BiTree_H

struct BiNode //二叉树的结点结构

{

char data;

BiNode *lchild, *rchild;

};

class BiTree

{

public:

BiTree( ){root = Creat(root);} //构造函数,建立一棵二叉树

~BiTree( ){Release(root);} //析构函数,释放各结点的存储空间

void PreOrder( ){PreOrder(root);} //前序遍历二叉树

void InOrder( ){InOrder(root);} //中序遍历二叉树

void PostOrder( ){PostOrder(root);} //后序遍历二叉树

void LeverOrder( ); //层序遍历二叉树

private:

BiNode *root; //指向根结点的头指针

BiNode *Creat(BiNode *bt); //构造函数调用

void Release(BiNode *bt); //析构函数调用

void PreOrder(BiNode *bt); //前序遍历函数调用

void InOrder(BiNode *bt); //中序遍历函数调用

void PostOrder(BiNode *bt); //后序遍历函数调用

};

#endif

//Bitree.cpp

#include

using namespace std;

#include "Bitree.h"

BiNode *BiTree::Creat(BiNode *bt)

{

char ch;

cout

cin>>ch;

if (ch=='#') return NULL;

else{

bt = new BiNode; //生成一个结点

bt->data=ch;

bt->lchild = Creat(bt->lchild); //递归建立左子树

bt->rchild = Creat(bt->rchild); //递归建立右子树

}

return bt;

}

void BiTree::Release(BiNode *bt)

{

if (bt != NULL){

Release(bt->lchild); //释放左子树

Release(bt->rchild); //释放右子树

delete bt;

}

}

void BiTree::PreOrder(BiNode *bt)

{

if(bt==NULL) return;

else {

coutdata

PreOrder(bt->lchild);

PreOrder(bt->rchild);

}

}

void BiTree::InOrder(BiNode *bt)

{

if (bt==NULL) return; //递归调用的结束条件

else {

InOrder(bt->lchild); //中序递归遍历root 的左子树

coutdata

InOrder(bt->rchild); //中序递归遍历root 的右子树

}

}

void BiTree::PostOrder(BiNode *bt)

{

if (bt==NULL) return; //递归调用的结束条件

else {

PostOrder(bt->lchild); //后序递归遍历root 的左子树

PostOrder(bt->rchild); //后序递归遍历root 的右子树

coutdata

}

}

void BiTree::LeverOrder( )

{

const int MaxSize=100;

int front=-1, rear=-1; //采用顺序队列,并假定不会发生上溢

BiNode *Q[MaxSize], *q;

if (root==NULL) return;

else {

Q[++rear]=root;

while (front!=rear)

{

q=Q[++front];

coutdata

if (q->lchild!=NULL) Q[++rear]=q->lchild;

if (q->rchild!=NULL) Q[++rear]=q->rchild;

}

}

}

//Bitree_main.cpp

#include

using namespace std;

#include "Bitree.h"

void main()

{

BiTree T; //创建一棵树

cout

T.PreOrder( );

cout

cout

T.InOrder( );

cout

cout

T.PostOrder( );

cout

cout

T.LeverOrder();

cout

}

注:源程序中Q[rear++],Q[front++],而rear,front 初始值均为-1,数组下标不会为 -1,故错误,分别改为Q[++rear],Q[++front]即可。

四、 运行与测试

(1)输入二叉树为

结果为:

(2)输入二叉树为:

输出结果为:

五、 总结

二叉树的存储结构—二叉链表,以及基于二叉链表的二叉树的建立,四种遍历二叉树的方法,尤其是递归思想在二叉树的构造函与遍历中的使用,需要特别注意,也要掌握。

实验题目:树的实现

一、 实验目的

(1) 树的逻辑结构

(2) 树的孩子兄弟存储结构

(3) 验证树的孩子兄弟存储结构及遍历操作

二、 实验内容

(1) 采用孩子兄弟表示法建立一棵树

(2) 基于树的孩子兄弟表示法实现前序和后序遍历树的操作

三、 设计与编码

1. 本实验用到的理论知识

(1)树的孩子兄弟表示法

(2)树的逻辑存储结构—孩子兄弟存储结构

(3)树的前序、后序遍历

2. 算法设计

(1)建立一棵树

先输入根结点。再递归建立左子树,右子树

(2)树的遍历

前序遍历:访问根结点、递归访问左子树、右子树

后序遍历:访问左子树、再访问右子树、最后访问根结点

3. 编码

//Tree.h

#ifndef Tree_H

#define Tree_H

const int Max = 20;

struct TNode

{

};

class Tree

{

public:

Tree(); ~Tree() { Release(root); } //析构函数,释放各结点的存储空间 void PreOrder() { PreOrder(root); } void PostOrder() { PostOrder(root); } char data; TNode *firstchild, *rightsib;

private:

};

#endif

//Tree.cpp TNode *root; void PreOrder(TNode *bt); void PostOrder(TNode *bt); void Release(TNode *bt);

#include

using namespace std;

#include "Tree.h"

Tree::Tree()

{

TNode *Q[Max] = { NULL }; char ch1 = '#', ch2 = '#',ch0='#'; int front = -1, rear = -1; TNode *p = NULL, *q = NULL,*s = NULL; cout > ch1; cout data = ch1; p->firstchild = p->rightsib = NULL; root = p; Q[++rear] = p; cout

while (ch1 != '#' || ch2 != '#') { p = new TNode; p->data = ch2; p->firstchild = p->rightsib = NULL; Q[++rear] = p; while (front != rear) { q = Q[front + 1]; if (q->data != ch1) front++; else { if (q->firstchild == NULL) q->firstchild = p; else { } s = q->firstchild; while (s->rightsib != NULL) s = s->rightsib; s->rightsib = p;

} } } } cout

void Tree::Release(TNode *bt)

{

}

void Tree::PreOrder(TNode *bt) if (bt == NULL) return; //递归调用的结束条件 else { } Release(bt->firstchild); //后序递归释放bt 的第一棵子树 Release(bt->rightsib); //后序递归释放bt 的右兄弟子树 delete bt; //释放根结点

}

void Tree::PostOrder(TNode *bt)

{

}

if (bt == NULL) return; //递归调用的结束条件 else { } PostOrder(bt->firstchild); //后序递归遍历root 的第一棵子树 PostOrder(bt->rightsib); //后序递归遍历root 的右兄弟子树 cout data; //访问根结点的数据域 if (bt == NULL) return; //递归调用的结束条件 else { } cout data; //访问根结点的数据域 PreOrder(bt->firstchild); //前序递归遍历root 的第一棵子树 PreOrder(bt->rightsib); //前序递归遍历root 的右兄弟子树

//Tree_main.cpp

#include

using namespace std;

#include "Tree.h"

int main()

{

}

四、 运行与测试

输入的树为: Tree t1; cout

输出结果为:

五、 总结

树的孩子兄弟表示法以及孩子兄弟存储结构,将其用程序语言来实现,其中指针的运用比较灵活,需要认真考虑。在程序中,也运用了递归的思想,递归在算法设计中还是非常有用的。

树和二叉树实验

实验题目:二叉树的实现

一、 实验目的

(1)掌握二叉树的逻辑结构;

(2)掌握二叉树的二叉链表存储结构;

(3)验证二叉树的二叉链表存储及遍历操作

二、 实验内容:

(1)建立一颗含有 n 个节点的二叉树,采用二叉链表存储

(2)输出前序、中序和后序遍历该二叉树的遍历结构

三、 设计与编码

1. 本实验用到的理论知识

(1)二叉树的存储结构:二叉链表;

(2)二叉树的四种遍历操作:前序、中序、后序和层序遍历;

2. 算法设计:

(1)二叉树的建立:用递归的方法,先递归建立根结点的左子树,再递归建立根结点

的右子树;

(2)二叉树的遍历操作:四种,均用到递归。

3. 编码

//Bitree.h

#ifndef BiTree_H

#define BiTree_H

struct BiNode //二叉树的结点结构

{

char data;

BiNode *lchild, *rchild;

};

class BiTree

{

public:

BiTree( ){root = Creat(root);} //构造函数,建立一棵二叉树

~BiTree( ){Release(root);} //析构函数,释放各结点的存储空间

void PreOrder( ){PreOrder(root);} //前序遍历二叉树

void InOrder( ){InOrder(root);} //中序遍历二叉树

void PostOrder( ){PostOrder(root);} //后序遍历二叉树

void LeverOrder( ); //层序遍历二叉树

private:

BiNode *root; //指向根结点的头指针

BiNode *Creat(BiNode *bt); //构造函数调用

void Release(BiNode *bt); //析构函数调用

void PreOrder(BiNode *bt); //前序遍历函数调用

void InOrder(BiNode *bt); //中序遍历函数调用

void PostOrder(BiNode *bt); //后序遍历函数调用

};

#endif

//Bitree.cpp

#include

using namespace std;

#include "Bitree.h"

BiNode *BiTree::Creat(BiNode *bt)

{

char ch;

cout

cin>>ch;

if (ch=='#') return NULL;

else{

bt = new BiNode; //生成一个结点

bt->data=ch;

bt->lchild = Creat(bt->lchild); //递归建立左子树

bt->rchild = Creat(bt->rchild); //递归建立右子树

}

return bt;

}

void BiTree::Release(BiNode *bt)

{

if (bt != NULL){

Release(bt->lchild); //释放左子树

Release(bt->rchild); //释放右子树

delete bt;

}

}

void BiTree::PreOrder(BiNode *bt)

{

if(bt==NULL) return;

else {

coutdata

PreOrder(bt->lchild);

PreOrder(bt->rchild);

}

}

void BiTree::InOrder(BiNode *bt)

{

if (bt==NULL) return; //递归调用的结束条件

else {

InOrder(bt->lchild); //中序递归遍历root 的左子树

coutdata

InOrder(bt->rchild); //中序递归遍历root 的右子树

}

}

void BiTree::PostOrder(BiNode *bt)

{

if (bt==NULL) return; //递归调用的结束条件

else {

PostOrder(bt->lchild); //后序递归遍历root 的左子树

PostOrder(bt->rchild); //后序递归遍历root 的右子树

coutdata

}

}

void BiTree::LeverOrder( )

{

const int MaxSize=100;

int front=-1, rear=-1; //采用顺序队列,并假定不会发生上溢

BiNode *Q[MaxSize], *q;

if (root==NULL) return;

else {

Q[++rear]=root;

while (front!=rear)

{

q=Q[++front];

coutdata

if (q->lchild!=NULL) Q[++rear]=q->lchild;

if (q->rchild!=NULL) Q[++rear]=q->rchild;

}

}

}

//Bitree_main.cpp

#include

using namespace std;

#include "Bitree.h"

void main()

{

BiTree T; //创建一棵树

cout

T.PreOrder( );

cout

cout

T.InOrder( );

cout

cout

T.PostOrder( );

cout

cout

T.LeverOrder();

cout

}

注:源程序中Q[rear++],Q[front++],而rear,front 初始值均为-1,数组下标不会为 -1,故错误,分别改为Q[++rear],Q[++front]即可。

四、 运行与测试

(1)输入二叉树为

结果为:

(2)输入二叉树为:

输出结果为:

五、 总结

二叉树的存储结构—二叉链表,以及基于二叉链表的二叉树的建立,四种遍历二叉树的方法,尤其是递归思想在二叉树的构造函与遍历中的使用,需要特别注意,也要掌握。

实验题目:树的实现

一、 实验目的

(1) 树的逻辑结构

(2) 树的孩子兄弟存储结构

(3) 验证树的孩子兄弟存储结构及遍历操作

二、 实验内容

(1) 采用孩子兄弟表示法建立一棵树

(2) 基于树的孩子兄弟表示法实现前序和后序遍历树的操作

三、 设计与编码

1. 本实验用到的理论知识

(1)树的孩子兄弟表示法

(2)树的逻辑存储结构—孩子兄弟存储结构

(3)树的前序、后序遍历

2. 算法设计

(1)建立一棵树

先输入根结点。再递归建立左子树,右子树

(2)树的遍历

前序遍历:访问根结点、递归访问左子树、右子树

后序遍历:访问左子树、再访问右子树、最后访问根结点

3. 编码

//Tree.h

#ifndef Tree_H

#define Tree_H

const int Max = 20;

struct TNode

{

};

class Tree

{

public:

Tree(); ~Tree() { Release(root); } //析构函数,释放各结点的存储空间 void PreOrder() { PreOrder(root); } void PostOrder() { PostOrder(root); } char data; TNode *firstchild, *rightsib;

private:

};

#endif

//Tree.cpp TNode *root; void PreOrder(TNode *bt); void PostOrder(TNode *bt); void Release(TNode *bt);

#include

using namespace std;

#include "Tree.h"

Tree::Tree()

{

TNode *Q[Max] = { NULL }; char ch1 = '#', ch2 = '#',ch0='#'; int front = -1, rear = -1; TNode *p = NULL, *q = NULL,*s = NULL; cout > ch1; cout data = ch1; p->firstchild = p->rightsib = NULL; root = p; Q[++rear] = p; cout

while (ch1 != '#' || ch2 != '#') { p = new TNode; p->data = ch2; p->firstchild = p->rightsib = NULL; Q[++rear] = p; while (front != rear) { q = Q[front + 1]; if (q->data != ch1) front++; else { if (q->firstchild == NULL) q->firstchild = p; else { } s = q->firstchild; while (s->rightsib != NULL) s = s->rightsib; s->rightsib = p;

} } } } cout

void Tree::Release(TNode *bt)

{

}

void Tree::PreOrder(TNode *bt) if (bt == NULL) return; //递归调用的结束条件 else { } Release(bt->firstchild); //后序递归释放bt 的第一棵子树 Release(bt->rightsib); //后序递归释放bt 的右兄弟子树 delete bt; //释放根结点

}

void Tree::PostOrder(TNode *bt)

{

}

if (bt == NULL) return; //递归调用的结束条件 else { } PostOrder(bt->firstchild); //后序递归遍历root 的第一棵子树 PostOrder(bt->rightsib); //后序递归遍历root 的右兄弟子树 cout data; //访问根结点的数据域 if (bt == NULL) return; //递归调用的结束条件 else { } cout data; //访问根结点的数据域 PreOrder(bt->firstchild); //前序递归遍历root 的第一棵子树 PreOrder(bt->rightsib); //前序递归遍历root 的右兄弟子树

//Tree_main.cpp

#include

using namespace std;

#include "Tree.h"

int main()

{

}

四、 运行与测试

输入的树为: Tree t1; cout

输出结果为:

五、 总结

树的孩子兄弟表示法以及孩子兄弟存储结构,将其用程序语言来实现,其中指针的运用比较灵活,需要认真考虑。在程序中,也运用了递归的思想,递归在算法设计中还是非常有用的。


相关文章

  • 八年制临床医学专业
  • 八年制临床医学专业 医学功能学实验报告 年级 班级 姓名 学号 功能学教学实验室 2008年 目 录 实验一 胃肠道平滑肌收缩 实验二 蛙心灌流 实验三 运动神经兴奋与骨骼肌收缩 实验四 血压的调节因素分析 实验五 呼吸功能调节因素分析 实 ...查看


  • 初三化学上册实验通知单
  • (共26份) 上学期化学实验通知单 通知日期: 年 月 日 实验日期: 年 月 日 备注: 演示实验提前2天通知实验教师,学生实验提前一周或根据实验材料培养日期再提前几天通知实验教师. 2013年9月1日 通知日期: 年 月 日 实验日期: ...查看


  • 实验室管理部分规章制度目录
  • 实验室管理部分规章制度目录 1. 江西理工大学实验教学管理办法 2. 江西理工大学实验课考试管理办法 3. 江西理工大学实验教学试讲制度 4. 江西理工大学实验室工作条例 5. 江西理工大学实验室规则 6. 江西理工大学学生实验守则 7.  ...查看


  • 九龙镇中心小学科学实验报告单(3-6年级)
  • 教科版小学科学实验报告单 学校 九龙镇中心小学 年级 六 时间 实验名称 观察植物 小组成员 实验目的 观察小草和大树的相同点和不同点 实验器材 小草(多种).大树(多种).放大镜 1.观察准备好的小草的根.茎.叶.花.果实.种子 的特点: ...查看


  • 心理实验系统
  • 心理实验系统的优势 1. 北师大辅仁淑凡心理实验系统,大量实验都是实验设计软件,能做开放实验设计实验,可以设置实验参数.参数可以是数字,字母,汉字,图片及视频图像. 2. 北师大辅仁淑凡心理实验系统,是标准化实验,实验结果采用的是windo ...查看


  • 实验教学质量评价与指标体系建立
  • 第30卷第2期 唐山师范学院学报 2008年3月 Vol.30 No.2 Journal of Tangshan Teachers College Mar. 2008 实验教学质量评价与指标体系建立 史智平 (宝鸡文理学院 物理系,陕西 宝 ...查看


  • 自动化实验室配置
  • 电气信息工程系 自动化实验室配置方案 过程控制实验装置是中控教仪根据自动化及相近专业的教学特点和学生培养目标,结合国内外最新科技动态而推出的集智能仪表技术,计算机技术,通讯技术,自动控制技术为一体的普及型多功能实验装置.该装置本着工程化.人 ...查看


  • 实验教学计划
  • 琚村小学2014-2015学年第一学期实验教学计划 一.指导思想 加强实验教学工作是贯彻教学大纲和课程标准的基本要求, 是实施素质教育的重要内容, 为进一步提高小学实验的管理水平和能力, 以及实验室材料实现科学化.分类.分档.档案管理,加强 ...查看


  • 科学实验作文大全,有趣的科学小实验作文
  • 有关科学实验的作文 筷子提米杯--一次神奇的科学实验作文300字 沙子和水"捉迷藏"(有趣的实验)作文300字 一次有趣的实验--捏鸡蛋300字 "纸蕾开花"的实验作文300字 日记:小实验鸡蛋&qu ...查看


  • 实验室建设规划合理化建议
  • 关于实验室建设合理化的建议 (一) 中药类专业实验室建设规划 实验教学是学校教学体系的重要组成部分,实验室是保障实验教学顺利进行的物质基础,是提高学生解决实际问题能力的基地,是培养创新精神.创新能力的重要场所.实验室建设水平的高低是衡量一个 ...查看


热门内容