广州大学学生实验报告
开课实验室:计算机科学与工程实验(电子楼417) 2018年05月16日
学院 |
计算机科学与教育软件学院 |
年级、专业、班 |
网络161 |
姓名 |
卟咚君 |
学号 |
1606100*** |
|
实验课程名称 |
数据结构实验 |
成绩 |
|
|||||
实验项目名称 |
实验二 树和二叉树的实现 |
指导老师 |
** |
|||||
一、实验类型: 验证性 实验目的:理解并运用树的操作方法 教学重点:多元树或二叉树的表示及遍历。 二、使用仪器、器材 微机一台 操作系统:WinXP 编程软件:C++ 三、实验内容及原理 (1)自己选择存储方式、自己设计输入输出方式,在实验报告中清晰说明。 (2)输入一棵二叉树进行多种遍历。树的高度(设空树高度为-1)不小于4,包含了儿子数为0、1、2的结点。选做:二叉树的总结点(或叶片)数目的统计。 思路:定义一个class BinTreeNode为二叉树的结点; 定义一个class BinaryTree 为二叉树; 在BinaryTree中的build_BinaryTree()函数进行建树,输入n个结点,按照搜索二叉树的方式逐个插入每个结点的值(Insert(const Type item)),输出的时候按照树逆时针90度的方式输出,前序遍历,中序遍历,后序遍历都采用了递归的方式实现。另外,存储的方式为每一个结点都有一个左儿子结点和右儿子结点的指针,初始化时为NULL,安装不断的插入时更新。前序遍历,中序遍历,后序遍历都主要是递归实现的。比如说,前序遍历,每一次都先输出当前结点的值,然后递归访问左儿子的结点,当左儿子的结点递归访问结束的时候,再递归访问右儿子结点。在二叉树的类中,还实现了二叉树结点的总数的计数,二叉树叶子结点的计数,二叉树的高度计数。以高度为例,一个结点子树的高度等于他的儿子结点的子树中的最大的高度+1,采用递归的方式实现。
源代码: #include<iostream> #include<ctime> #include<cmath> #include<algorithm> using namespace std; const int INF = int(1e9) + 7; template<typename Type> class BinTreeNode{ //二叉树的结点 public: BinTreeNode() :left(NULL), right(NULL){} BinTreeNode(Type item, BinTreeNode<Type> *m_left = NULL, BinTreeNode<Type> *m_right = NULL) :data(item), left(m_left), right(m_right){} Type GetData() const; //获得该结点的data BinTreeNode<Type> *GetLeft() const; //获得左儿子的结点 BinTreeNode<Type> *GetRight() const; //获得右儿子的结点 void SetData(const Type data); //设置该结点的data void SetLeft(const BinTreeNode<Type> *m_left); //设置该结点的左儿子结点 void SetRight(const BinTreeNode<Type> *m_right); //设置该结点的右儿子结点 void InOrder(); //中序遍历 void PreOrder(); //前序遍历 void PostOrder(); //后序遍历 int Size(); //返回结点总数 int Height(); //返回二叉树的高度 int LeavesSize(); //返回二叉树的叶子结点的总数 void Destroy(){ //销毁二叉树 if (this != NULL){ this->left->Destroy(); this->right->Destroy(); delete this; } } BinTreeNode<Type> *left, *right; Type data; }; template<typename Type> Type BinTreeNode<Type>::GetData() const{ //返回该结点的数值 return this != NULL ? data : INF; } template<typename Type> BinTreeNode<Type>* BinTreeNode<Type>::GetLeft() const{ //返回该结点的左儿子的结点指针 return this != NULL ? left : NULL; } template<typename Type> BinTreeNode<Type>* BinTreeNode<Type>::GetRight() const{ //返回该结点的右儿子的结点指针 return this != NULL ? right : NULL; } template<typename Type> void BinTreeNode<Type>::SetData(const Type m_data){ //设置该结点的data if (this != NULL){ data = m_data; } } template<typename Type> void BinTreeNode<Type>::SetLeft(const BinTreeNode<Type> *m_left){ //设置该结点的左儿子结点 if (this != NULL){ left = |