ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:32.34KB ,
资源ID:6370210      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6370210.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构实验报告树形数据结构实验.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构实验报告树形数据结构实验.docx

1、数据结构实验报告树形数据结构实验实验报告书课程名: 数据结构 题 目: 树形数据结构实验(1) 班 级: 学 号: 姓 名: 一、目的与要求1)熟练掌握二叉树的二叉链表表示创建算法与实现;2)熟练掌握栈的前序、中序与后序递归遍历算法与实现;3)熟练掌握前序、中序与后序遍历线索二叉树的基本算法与实现;4)按照实验题目要求独立正确地完成实验内容(提交程序清单及相关实验数据与运行结果); 5)认真书写实验报告,并按时提交。二、实验内容或题目1) 创建二叉树:广义表式创建与先序创建;2) 遍历二叉树:先,中,后,层序遍历,广义表式遍历,凹凸式遍历;3) 二叉树属性:深度,宽度,结点数,叶子结点数4)

2、二叉树路径:叶子结点到根结点的路径;5)二叉树线索:中序线索二叉树;6)二叉树置空:清空二叉树。三、实验步骤与源程序1)头文件Btree.h#include #include #include #include #include /*对象-二叉数* */typedef char ElemType; / 定义元素类型#define MAXSIZE 100 / 确定二叉树的最大结点数/*二叉数的结点类定义*/class BTreeNode private: int ltag,rtag; / 线索标记 BTreeNode *left; / 左子树指针 BTreeNode *right; / 右子树指

3、针 public: ElemType data; / 数据域 / 构造函数 BTreeNode() ltag=0; rtag=0; left=NULL; right=NULL; / 带参数初始化的构造函数 BTreeNode(ElemType item,int ltag1,int rtag1,BTreeNode *left1,BTreeNode *right1) data=item; ltag=ltag1; rtag=rtag1; left=left1; right=right1; BTreeNode *&Left() / 返回结点的左孩子 return left; / 返回结点的右孩子 BT

4、reeNode *&Right() return right; friend class BinaryTree; / 二叉树类为二叉树结点类的友元类/*二叉数的类定义*/class BinaryTreeprivate: BTreeNode *root;public: /构造函数.初始化二叉树为空 BinaryTree() root=NULL; / 判断二叉树是否为空 bool BTreeEmpty() return root=NULL; /*创建二叉数的相关成员函数*/ / 按照二叉树的广义表表示创建二叉树 void CreateBTree1(); / 递归创建二叉树,被函数CreateBTr

5、ee1调用 void Create1(BTreeNode *&BT); / 按一定次序输入二叉树中结点的值(一个字符),空格表示空树 void CreateBTree2(int make); / 递归先序创建二叉树,被函数CreateBTree2调用 void Greate2(BTreeNode*&BT,int mark); / 复制二叉树 void BTreeCopy(BTreeNode *&root,BTreeNode *&BT); /*遍历二叉数的相关成员函数*/ / 按任一种遍历次序输出二叉树中的所有结点 void TraverseBTree(int mark); / 用于遍历的递归函

6、数,被函数TraverseBTree调用 void Traverse(BTreeNode *&BT,int mark); / 先序遍历的递归函数 void PreOrder(BTreeNode *&BT); / 先序遍历的非递归函数一 void PreOrder_N1(BTreeNode *&BT); / 先序遍历的非递归函数二 void PreOrder_N2(BTreeNode *&BT); / 中序遍历的递归函数 void InOrder(BTreeNode *&BT); / 中序遍历的非递归函数一 void InOrder_N1(BTreeNode *&BT); / 中序遍历的非递归函

7、数二 void InOrder_N2(BTreeNode *&BT); / 后序遍历的递归函数 void PostOrder(BTreeNode *&BT); / 后序遍历的非递归函数一 void PostOrder_N1(BTreeNode *&BT); / 后序遍历的递归函数 void PostOrder_N2(BTreeNode *&BT); / 层序遍历的非递归函数 void LayerOrder(BTreeNode *&BT); / 按照二叉树的广义表表示输出整个二叉树 void GPrintBTree(); / 广义表形式输出整个二叉树的递归函数,被函数Print调用 void G

8、Print(BTreeNode *&BT); / 以凹凸表示法输出二叉树 void OPrintTree(); /*二叉树的属性*/ /*计算二叉数深度,宽度,叶子,结点的相关成员函数*/ / 求二叉树的深度 int BTreeDepth(); / 用于求二叉树深度的递归函数,被BTreeDepth调用 int Depth(BTreeNode *&BT); / 求二叉树的宽度 int BTreeWidth(); / 求二叉树中所有结点数 int BTreeCount(); / 用于求二叉树所有结点数的递归函数,被函数BTreeCount调用 int Count(BTreeNode *&BT);

9、 / 求二叉树中所有叶子结点数 int BTreeLeafCount(); / 用于求二叉树中所有叶子结点数的递归函数,被函数BTreeLeafCount调用 int LeafCount(BTreeNode *&BT); / 输出二叉树的所有叶子结点 void BTreeLeafPrint(); / 用于输出二叉树的所有叶子结点的递归函数,被函数BTreeLeafPrint调用 void LeafPrint(BTreeNode *&BT); /*二叉树中从根结点到叶子结点的路径相关函数*/ / 输出从根结点到叶子结点的路径,以及最长路径 void BTreePath(); / 输出从根结点到叶

10、子结点的路径的递归函数,被函数BTreePath调用 void PathLeaf(BTreeNode *&BT,ElemType path,int pathlen); / 求最长路径的递归函数,被函数BTreePaht调用 void BTreeLongpath(BTreeNode *&BT,ElemType path,int pathlen,ElemType longpath,int &longpathlen); / 非递归方法输出从根结点到叶子结点的路径 void BTreePath_N1(); / 返回data域为x的结点指针 void BTreeFind(ElemType x); / 返

11、回data域为x的结点指针的递归函数,被函数BTreeFind调用 BTreeNode *FindNode(BTreeNode *&BT,ElemType x); /*线索二叉树*/ / 线索化二叉树 void CreateThread(); / 中序线索化二叉树的递归函数,被函数CreateThread调用 void InOrderThread(BTreeNode *&BT,BTreeNode *&pre); / 中序线索化二叉树中实现中序遍历,被函数CreateThread调用 void ThInOrder(BTreeNode *&BT); /*销毁二叉数的相关成员函数*/ / 置空二叉树

12、 void BTreeClear(); / 用于清除二叉树的递归函数,被函数BTreeClear与BinaryTree调用 void Clear(BTreeNode *&BT); / 析构函数,清除二叉树 BinaryTree();/*创建二叉数的相关成员函数*/ 按照二叉树的广义表表示创建二叉树void BinaryTree:CreateBTree1() cout输入广义表形式的二叉树:endl; root=NULL; / 给树根指针置空 Create1(root); / 递归创建二叉树,被函数CreateBTree1调用void BinaryTree:Create1(BTreeNode *

13、&BT) BTreeNode *stackMAXSIZE,*p=NULL; int k,top=-1; char ch; while(ch=getchar()!=#) switch(ch) case (: top+; stacktop=p; k=1; / 即将建立左结点 break; case ): top-; break; case ,: k=2; / 即将建立右结点 break; default: if(!(p=new BTreeNode) coutdata=ch; p-left=p-right=NULL; if(BT=NULL) / p指向二叉树的根结点,建立根结点 BT=p; else

14、 / 已经建立根结点 if(k=1) / 建立左结点 stacktop-left=p; else / 建立右结点 stacktop-right=p; /switch(ch) /while/ 按一定次序输入二叉树中结点的值(一个字符),空格表示空树void BinaryTree:CreateBTree2(int mark) switch(mark) case 1: puts(按先序输入二叉树:); break; case 2: puts(按中序输入二叉树:); break; case 3: puts(按后序输入二叉树:); break; root=NULL; / 给树根指针置空 BTreeNod

15、e *&p=root; / 定义p为指向二叉树结点的指针 Greate2(p,mark); / 递归创建二叉树,被函数CreateBTree2调用void BinaryTree:Greate2(BTreeNode *&BT,int mark) char ch; ch=getchar(); switch(mark) case 1: / 先序创建 if(ch= ) BT=NULL; else if(!(BT=new BTreeNode) coutdata=ch; Greate2(BT-left,mark); Greate2(BT-right,mark); break; case 2: break;

16、 case 3: break;/ 复制二叉树void BinaryTree:BTreeCopy(BTreeNode *&root,BTreeNode *&BT) if(root) if(!(BT=new BTreeNode) exit(1); BT-data=root-data; BTreeCopy(root-left,BT-left); BTreeCopy(root-right,BT-right); else BT=NULL;/*遍历二叉数的相关成员函数*/ 按任一种遍历次序输出二叉树中的所有结点void BinaryTree:TraverseBTree(int mark) srand(ti

17、me(NULL); / 产生随机种子数,用来选择相同顺序遍历的不同算法 Traverse(root,mark); coutendl;/ 用于遍历的递归函数,被函数TraverseBTree调用void BinaryTree:Traverse(BTreeNode *&BT,int mark) int option; switch(mark) case 1: / 先序遍历 option=rand()%3+1; switch(option) / 随机选择一种先序算法 case 1: PreOrder(BT); break; case 2: PreOrder_N1(BT); break; case 3

18、: PreOrder_N2(BT); break; break; case 2: / 中序遍历 option = rand()%3 + 1; switch(option) / 随机选择一种中序算法 case 1: InOrder(BT); break; case 2: InOrder_N1(BT); break; case 3: InOrder_N2(BT); break; break; case 3: / 后序遍历 option=rand()%3+1; switch(option) / 随机选择一种先序算法 case 1: PostOrder(BT); break; case 2: Post

19、Order_N1(BT); break; case 3: PostOrder_N2(BT); break; break; case 4: / 层序遍历 LayerOrder(BT); break; default: coutmark的值无效!遍历失败!endl;/ 先序遍历的递归函数void BinaryTree:PreOrder(BTreeNode *&BT) if(BT!=NULL) coutdataleft); PreOrder(BT-right);/ 先序遍历的非递归函数一void BinaryTree:PreOrder_N1(BTreeNode *&BT) BTreeNode *p;

20、 struct BTreeNode *pt; int tag; stackMAXSIZE; int top=-1; top+; stacktop.pt=BT; stacktop.tag=1; while(top-1) / 栈不空时循环 if(stacktop.tag=1) / 不能直接访问 p=stacktop.pt; top-; if(p!=NULL) / 按右,左,结点顺序进栈,后进先出,即先序遍历 top+; stacktop.pt=p-right; / 右孩子入栈 stacktop.tag=1; top+; stacktop.pt=p-left; / 左孩子入栈 stacktop.ta

21、g=1; top+; stacktop.pt=p; / 根结点入栈 stacktop.tag=0; / 可以直接访问 if(stacktop.tag=0) / 可以直接访问 coutdata-1) / 栈不空时循环 p=stacktop; top-; coutdataright != NULL) / 右孩子入栈 top+; stacktop = p-right; if(p-left != NULL) / 左孩子入栈 top+; stacktop = p-left; /while /if(root!=NULL)/ 中序遍历的递归函数void BinaryTree:InOrder(BTreeNod

22、e *&BT) if(BT!=NULL) InOrder(BT-left); coutdataright);/ 中序遍历的非递归函数一void BinaryTree:InOrder_N1(BTreeNode *&BT) BTreeNode *p; struct BTreeNode *pt; int tag; stackMAXSIZE; int top = -1; top+; stacktop.pt = BT; stacktop.tag = 1; while(top-1) / 栈不空时循环 if(stacktop.tag = 1) / 不能直接访问 p = stacktop.pt; top-;

23、if(p!=NULL) / 按右,左,结点顺序进栈,后进先出,即先序遍历 top+; stacktop.pt=p-right; / 右孩子入栈 stacktop.tag = 1; top+; stacktop.pt = p; / 根结点入栈 stacktop.tag = 0; / 可以直接访问 top+; stacktop.pt =p-left; / 左孩子入栈 stacktop.tag = 1; if(stacktop.tag = 0) / 可以直接访问 coutdata -1|p != NULL) while(p != NULL) / 所有左结点入栈 top+; stacktop = p; p = p-left; if(top -1) p = stacktop; top-; coutdataright; /if/ 后序遍历的递归函数void BinaryTree:PostOrder(BTreeNode *&BT) if(BT!=NULL) PostOrder(BT-left); PostOrder(BT-right); coutdata-1) / 栈不空时循环 if(stacktop.tag = 1) / 不能

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1