二叉树类模板的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
封皮
(按学校要求手工填写)
成绩评定表
课程设计任务书
摘要
树结构在客观世界中广泛存在,如族谱、各种社会组织机构等都可以用树形结构来表示;树结构在计算机中应用也很广泛,如文件夹;其中二叉树结构是比较常用的一种数据结构,简单来说每个结点最多有两个孩子。本文采用C++语言来描述二叉树类模板的设计并实现其功能,并且采用VS2010应用程序来实现程序。
关键词:二叉树类模板;MFC
目录
1 需求分析 (1)
2 算法基本原理 (1)
3 类设计 (1)
4 基于控制台的应用程序 (2)
4.1类的接口设计 (2)
4.2类的实现 (3)
4.3主函数设计 (8)
4.4基于控制台的应用程序测试 (9)
5 基于MFC的应用程序 (10)
5.1基于MFC的应用程序设计 (10)
5.1.1 MFC程序界面设计 (11)
5.1.2 MFC程序代码设计 (13)
5.2基于MFC的应用程序测试 (17)
结论 (20)
参考文献 (21)
1需求分析
进行二叉树类模板的设计并实现,数据元素可以是char,int,float等多种数据类型,包括以下功能:
(1)采取顺序存储结构或链式存储结构实现二叉树的存储;
(2)实现二叉树的建树;
(3)实现二叉树的前序、中序、后序遍历;
(4)能够求解二叉树的结点总数和叶子结点总数;
(5)能够求解二叉树的高度;
(6)将上述功能作为类的成员函数实现,编写主函数测试上述功能。
整个二叉树类模板程序中的存储采用的是链式存储结构。在整个二叉树类中所有数据成员和成员函数均采用公有方式,类中有一个二叉树结点的定义,有建立二叉树的成员函数,有先序、中序、后序遍历的成员函数,有求解结点数、叶子节点数、二叉树深度的成员函数,它的功能在类里定义一个调用各个成员函数的成员函数来实现对二叉树的操作,然后在主函数中通过对模板的实例化产生对象,用对象调用成员函数的方式实现预期功能。
2算法基本原理
一颗二叉树有许多个结点组成,每个结点有三个区域分别存有数据和它的左右孩子指针。
大体思路:先构造一棵二叉树,然后依次实现前序、中序、后序遍历,统计二叉树的结点总数,统计二叉树的叶子结点数,求出二叉树的高度这些功能。
在主函数中实例化char,int,float数据类型的类对象,然后根据类对象来实现功能。
3 类设计
根据算法分析可以看到,本设计首先应该设计一个二叉树的模板类,可将ertree作为二叉树的类名,然后在这个类中定义各个成员函数来实现所需要的功能。
类的设计如下:
template
classertree{
public:
typedefstruct node{//二叉树的节点
T data;
struct node *lchild,*rchild;
}bitree;
bitree *tree1();//建立二叉树
Xxu(bitree *p);//先序遍历的结果
Zxu(bitree *p);//中序遍历的结果
Hxu(bitree *p);//后序遍历的结果
JDS(bitree *p);//结点数
YZJDS1(bitree *p);//叶子结点数
height(bitree *p);//二叉树的高度
fun();//调用成员函数
}
在实现过程中,需要访问ertree类数据成员,将其数据成员设置成公有的即可。
4 基于控制台的应用程序
整个程序分为两个独立的文档,Debug 文件夹中包含有VS2010编译好的应用程序,可独立运行;其他文件夹整体包含程序所需要的各个组件,需要依靠VS2010才能运行。
4.1 类的接口设计
#include
#include
#include
using namespace std;
template
classertree{
public:
typedefstruct node{//二叉树的节点
T data;
struct node *lchild,*rchild;
}bitree;
bitree *p;//定义一个类中的变量用来存储根结点
bitree *tree1();//建立二叉树,从键盘由先序输入二叉树元素
void Xxu(bitree *p);//先序遍历的结果
void Zxu(bitree *p);//中序遍历的结果
void Hxu(bitree *p);//后序遍历的结果
int JDS(bitree *p);//结点数
int YZJDS1(bitree *p);//叶子结点数
int YZJDS2(bitree *p);//叶子结点数
int YZJDS3(bitree *p);//叶子结点数
int height(bitree *p);//二叉树的高度
void fun1();//调用成员函数
};
在ertree类中没有定义构造函数和析构函数,因为这两个函数在运行时类可以自动生成,并不影响类的功能。
4.2 类的实现
//用递归的方式来建立二叉树
bitree *tree1(){//建立二叉树
bitree *t;