1、数据结构课程设计实验报告二叉树的实现数据结构实验报告题目:_二叉树的实现 学号:_ _姓名:_ _东南大学成贤学院计算机系实验题目一、实验目的1.掌握二叉树的基本操作,理解递归算法。二、实验内容1将下图所示二叉树采用二叉链表进行存储,然后进行各种操作测试。三、实验步骤1.启动:开始菜单程序Microsoft Visual Studio 6.0 2.建立工程:文件(File)新建(new)在弹出的对话框中选择工程标签(Project)选中选项:Win32 Console Application(不能选别的)输入工程名(Project Name)选择工程的存放位置(Location)单击“确定”按
2、钮(OK)在弹出的对话框中选中选项:An Empty Project单击“完成”按钮(Finish)在弹出的对话框中单击“确定”按钮( OK )。3.创建头文件:文件(File)新建(new)在弹出的对话框中选择文件标签(Files) 选中选项:C/C+ Header File输入头文件名(此处定义为“”)单击“确定”按钮(OK)。内容如下:/ 二叉树结点类模板 template struct BinTreeNode/ 数据成员: ElemType data; / 数据域 BinTreeNode *leftChild; / 左孩子 BinTreeNode *rightChild; / 右孩子;
3、4.创建头文件:文件(File)新建(new)在弹出的对话框中选择文件标签(Files) 选中选项:C/C+ Header File输入头文件名(此处定义为“”)单击“确定”按钮(OK)。 定义了链队的类模板,代码如下:#ifndef _BINNARY_TREE_H_#define _BINNARY_TREE_H_/ 二叉树类模板template class BinaryTreeprivate:/ 二叉树的数据成员: BinTreeNode *root;/ 二叉树的私有函数: void PreOrderHelp(BinTreeNode *r); / 先序遍历void InOrderHelp(B
4、inTreeNode *r); / 中序遍历void PostOrderHelp(BinTreeNode *r);/ 后序遍历void Creat(BinTreeNode *r, int flag, ElemType empty, ElemType end);/递归创建子树BinTreeNode *GetRoot(); /返回根指针BinTreeNode *Locate(BinTreeNode *r, ElemType e); /查找元素值为e的结点,返回指针.BinTreeNode* LeftChild(ElemType e); /定位指定元素的左孩子,返回其指针。BinTreeNode*
5、Parent(BinTreeNode*r, ElemType e); /定位指定元素的父结点BinTreeNode* LeftSibling(ElemType e); /定位指定元素的左兄弟int Size(BinTreeNode *r); int Depth(BinTreeNode *r); int Leaf(BinTreeNode *r); /统计并返回叶子结点个数void Clear(BinTreeNode *r); void DisplayTreeeHelp(BinTreeNode *r, int level);/ 按树状形式显示以r为根的二叉树,level为层次数,可设根结点的层次数
6、为1public:/ 二叉树公共方法声明:BinaryTree(); / 无参数的构造函数模板void CreateBiTree();/ 构造二叉树 BinTreeNode *GetRoot(); / 返回二叉树的根void InOrder(); / 二叉树的中序遍历 void PreOrder(); / 二叉树的先序遍历void PostOrder(); / 二叉树的后序遍历void LevelOrder(); /按层遍历int Locate(ElemType e); /查找元素值为e的结点。int GetLeft(ElemType e, ElemType &c); /读取指定元素的左孩子i
7、nt GetParent(ElemType e, ElemType &f); /读取指定元素的父元素int GetLeftSibling(ElemType e, ElemType &s); /读取指定元素的左兄弟int InsertChild(ElemType e,ElemType x,ElemType y);/为指定元素 e 插入左、右孩子int SetElem(ElemType e, ElemType x);/更新指定元素int Size( ); int Depth( ); int Leaf( ); /统计并返回叶子结点个数virtual BinaryTree();/ 销毁二叉树void
8、DisplayTree();函数实现由学生自己完成#endif5. 创建源程序文件main.cpp:文件(File)新建(new)在弹出的对话框中选择文件标签(Files) 选中选项:C+ Source File输入源程序文件名(main)单击“确定”按钮(OK)。文件内容如下:#include binary_tree.h / 二叉树类int main(void)利用swtich构造菜单,对二叉树操作进行测试。(初始化,构造二叉树,图形显示,前序,中序,后序遍历结果,求结点个数,二叉树深度,叶子结点树,查找结点,找指定结点的左孩子,双亲,左兄弟,插入新的左、右孩子。注意:1.在编程过程中注意及
9、时保存编写内容。四、实验结果1.的代码2.的代码3.运行结果截图(可以有多张)1、#pragma once#include ”using namespace std;/ 二叉树类模板template class BinaryTreeprivate: / 二叉树的数据成员: BinTreeNode *root; / 二叉树的私有函数: void PreOrderHelp(BinTreeNode *r); / 先序遍历 void InOrderHelp(BinTreeNode *r); / 中序遍历 void PostOrderHelp(BinTreeNode *r);/ 后序遍历 void Cr
10、eat(BinTreeNode *r, int flag, ElemType empty, ElemType end); /递归创建子树 BinTreeNode *GetRoot(); /返回根指针 BinTreeNode *Locate(BinTreeNode *r, ElemType e); /查找元素值为e的结点,返回指针. BinTreeNode* LeftChild(ElemType e); /定位指定元素的左孩子,返回其指针。 BinTreeNode* Parent(BinTreeNode*r, ElemType e); /定位指定元素的父结点 BinTreeNode* LeftS
11、ibling(ElemType e); /定位指定元素的左兄弟 int Size(BinTreeNode *r); int Depth(BinTreeNode *r); int Leaf(BinTreeNode *r); /统计并返回叶子结点个数 void Clear(BinTreeNode *r); void DisplayTreeeHelp(BinTreeNode *r, int level); / 按树状形式显示以r为根的二叉树,level为层次数,可设根结点的层次数为1 int size;public: / 二叉树公共方法声明: BinaryTree(); / 无参数的构造函数模板 v
12、oid CreateBiTree();/ 构造二叉树 /BinTreeNode *GetRoot(); / 返回二叉树的根 void InOrder(); / 二叉树的中序遍历 void PreOrder(); / 二叉树的先序遍历 void PostOrder(); / 二叉树的后序遍历 void LevelOrder(); /按层遍历 int Locate(ElemType e); /查找元素值为e的结点。 int GetLeft(ElemType e, ElemType &c); /读取指定元素的左孩子 int GetParent(ElemType e, ElemType &f); /读
13、取指定元素的父元素 int GetLeftSibling(ElemType e, ElemType &s); /读取指定元素的左兄弟 int InsertChild(ElemType e, ElemType x, ElemType y); /为指定元素 e 插入左、右孩子 int SetElem(ElemType e, ElemType x); /更新指定元素 int Size(); int Depth(); int Leaf(); /统计并返回叶子结点个数 virtual BinaryTree();/ 销毁二叉树 void DisplayTree();template void Binary
14、Tree:PreOrderHelp( BinTreeNode *r) / private if (r != NULL) cout data leftChild); / 遍历左子树 PreOrderHelp(r-rightChild); / 遍历右子树 template void BinaryTree:PreOrder() / public PreOrderHelp(root);template void BinaryTree:InOrderHelp( BinTreeNode *r) / private if (r != NULL) InOrderHelp(r-leftChild); / 遍历左
15、子树 cout data rightChild); / 遍历右子树 template void BinaryTree:InOrder() / public InOrderHelp(root);template void BinaryTree:PostOrderHelp( BinTreeNode *r) / private if (r != NULL) PostOrderHelp(r-leftChild); / 遍历左子树 PostOrderHelp(r-rightChild); / 遍历右子树 cout data ; / 访问根结点 template void BinaryTree:PostO
16、rder() / public PostOrderHelp(root);template void BinaryTree:LevelOrder() LinkQueueBinTreeNode * q; BinTreeNode *t = root; if (t != NULL) (t); / 如果根非空,则入队 while (!() (t); cout data leftChild != NULL) / 左孩子非空 (t-leftChild); / 左孩子入队 if (t-rightChild != NULL) / 右孩子非空 (t-rightChild); / 右孩子入队 template Bi
17、naryTree:BinaryTree() root = NULL;template void BinaryTree:CreateBiTree() BinTreeNode* r; ElemType end, empty, x; cout 按先序序列的顺序输入一棵二叉树 endl; cout end; cout empty; cout 请开始输入: x; r = new BinTreeNode; r-data = x; r-leftChild = r-rightChild = NULL; root = r; Creat(r, 0, empty, end); /创建根结点的左子树 Creat(r,
18、 1, empty, end); /创建根结点的右子树template void BinaryTree:Creat(BinTreeNode *r,int flag, ElemType empty, ElemType end) BinTreeNode *p; ElemType x; cin x; if (x != end&x != empty) p = new BinTreeNode; p-data = x; p-leftChild = p-rightChild = NULL; if (flag = 0) r-leftChild = p; /p为左子树 else r-rightChild = p
19、; /p为右子树 size+; Creat(p, 0, empty, end); /递归创建左子树 Creat(p, 1, empty, end); /递归创建右子树 template BinTreeNode*BinaryTree:GetRoot() return root;template BinTreeNode*BinaryTree:Locate(BinTreeNode *r, ElemType e) /private if (r = NULL) return NULL; if (r-data = e) return r; BinTreeNode *p = Locate(r-leftChi
20、ld, e); if (p = NULL) p = Locate(r-rightChild, e); return p;template int BinaryTree:Locate(ElemType e) /public if (Locate(root, e) = NULL) return false; else return true;template BinTreeNode*BinaryTree:LeftChild(ElemType e) /private BinTreeNode* ep = Locate(root, e); if (ep = NULL) return NULL; /找不到
21、结点e if (ep-leftChild = NULL) /e无左孩子 return NULL; return ep-leftChild; /返回e左孩子的指针template int BinaryTree:GetLeft(ElemType e, ElemType &c) /Public BinTreeNode* p = LeftChild(e); if (p = NULL) return false; /e无左孩子 c = p-data; return true;template BinTreeNode* BinaryTree:Parent(BinTreeNode*r, ElemType e
22、) /private BinTreeNode* p; if (r = NULL)return NULL; if (r-leftChild != NULL&r-leftChild-data = e) | (r-rightChild != NULL&r-rightChild-data = e) return r; /r是e的父结点,返回结点r的指针 p = Parent(r-leftChild, e); /递归调用r的左子树 if (p = NULL) p = Parent(r-rightChild, e); return p;template int BinaryTree:GetParent(E
23、lemType e, ElemType &f) /public if (root = NULL | root-data = e) return false; BinTreeNode *p = Parent(root, e); if (p = NULL) return false; /树中无元素e f = p-data; return true;template BinTreeNode* BinaryTree:LeftSibling(ElemType e) /private if (root-data = e) return NULL; BinTreeNode *p = Parent(root,
24、 e); if (p = NULL)return NULL; /无e结点 if (p-leftChild-data = e) /e是其父亲的左孩子 return NULL; return p-leftChild; /返回e的左兄弟指针template int BinaryTree:GetLeftSibling(ElemType e, ElemType &s) if (root-data = e)return false; /根结点无兄弟 BinTreeNode *p = LeftSibling(e); if (p = NULL)return false; /e无左兄弟 s = p-data; return true;template int BinaryTree:InsertChild(ElemType e, ElemType x, ElemType y) BinTreeNode *ep, *xp, *yp; ep = Locate(root, e); /定位元素e if (ep = NULL) return false; /找不到元素e xp = new BinTreeNode; xp-data = x; xp-rightChild = NULL; yp = new BinTreeNode; yp-data
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1