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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

山东大学数据结构实验报告五.docx

1、山东大学数据结构实验报告五数据结构实验报告实验五实验题目:排序算法 学号:1日期:2015.12.11班级:计机14.1:方铮Email:liu3.实验目的:二叉树操作 任务要求:一、实验目的 1、掌握二叉树的基本概念,链表描述方法;遍历方法。二、实验容 创建二叉树类。二叉树的存储结构使用链表。提供操作:前序遍历、中序遍历、后序遍历、层次遍历、计算二叉树结点数目、计算二叉树高度。对建立好的二叉树,执行上述各操作。接收键盘录入的二叉树前序序列和中序序列(各元素各不相同),输出该二叉树的后序序列。软件环境:Win7 操作系统开发工具:visual C+ 6.0实验代码:#include #incl

2、ude #include #include using namespace std;#define MaxSize 100#define MaxWidth 40#include #include #include #includetypedef char ElemType;typedef struct tnode ElemType data; struct tnode *lchild,*rchild; BTNode;/*建立二叉树算法描述:用ch扫描采用括号表示法表示二叉树的字符串Str。分以下几种情况:1、若ch=(则将前面刚创建的结点作为双亲结点进栈,并置k=1,表示其后创建的结点将做为这

3、个结点的左孩子结点。2、若ch=)表示栈中结点的左右孩子结点处理完毕,退栈。3、若ch=,表示其后创建的结点为右孩子结点4、其他情况表示要创建一个结点,并根据k值建立它与栈中结点之间的关系,当k=1时,表示这个结点作为栈中结点的左孩子结点,当k=2时,表示这个结点作为栈中结点的右孩子结点。如此循环直到str处理完毕。算法中使用一个栈st保存双亲结点,top为其栈指针,k指定其后处理的结点是双亲结点(保存在栈中)的左孩子结点(k=1)还是右孩子结点(k=2)。*/void CreateBtree(BTNode * &bt,char *str) /由str创建二叉链bt BTNode *stMax

4、Size,*p=NULL; int top=-1,k,j=0; char ch; bt=NULL; /建立的二叉树初始为空 ch=strj; while(ch!=0) /str未扫描完时循环 switch(ch) case (:top+;sttop=p;k=1;break;/为左孩子结点 case ):top-;break; case ,:k=2;break; default:p=(BTNode *)malloc(sizeof(BTNode); p-data=ch;p-lchild=p-rchild=NULL; if(bt=NULL) bt=p; else switch(k) case 1:s

5、ttop-lchild=p;break; case 2:sttop-rchild=p;break; j+; ch=strj; /*求二叉树高度算法:递归模型如下if(b=NULL) f(b)=0;else f(b)=maxf(b)-lchild,f(b)-rchild+1;*/int BTHeight(BTNode *bt) int lchilddep,rchilddep; if(bt=NULL) return 0; else lchilddep=BTHeight(bt-lchild); rchilddep=BTHeight(bt-rchild); return (lchilddeprchil

6、ddep)?(lchilddep+1):(rchilddep+1); /*求二叉树结点个数算法:递归模型如下if(bt=NULL) f(b)=1;else f(bt)=f(bt-lchild)+f(bt-rchild)+1;*/int NodeCount(BTNode *bt) int num1,num2; if(bt=NULL) return 0; else num1=NodeCount(bt-lchild); num2=NodeCount(bt-rchild); return num1+num2+1; /*求二叉树叶子结点个数算法:递归模型如下if(bt=NULL) f(bt)=0;if(

7、bt为叶子结点) f(bt)=1;else f(bt)=f(bt-lchild)+f(bt-rchild);*/int LeafCount(BTNode *bt) int num1,num2; if(bt=NULL) return 0; else if(bt-lchild=NULL&bt-rchild=NULL) return 1; else num1=LeafCount(bt-lchild); num2=LeafCount(bt-rchild); return num1+num2; /*以括号表示法输出二叉树运算算法*/void DispBtreel(BTNode *bt) if(bt!=N

8、ULL) coutdata; if(bt-lchild!=NULL|bt-rchild!=NULL) coutlchild); if(bt-rchild!=NULL) coutrchild); cout); /*=* Function name: BT_PreOrder* Parameter: root:树根节点指针* Precondition: None* Description: 前序遍历=*/void BT_PreOrder(BTNode *bt) if (NULL != bt) coutdata;/visit(bt); BT_PreOrder(bt-lchild); BT_PreOrd

9、er(bt-rchild); /*=* Function name: BT_InOrder* Parameter: root:树根节点指针* Precondition: None* Description: 中序遍历* Return value: void=*/void BT_InOrder(BTNode *bt) if (NULL != bt) BT_InOrder(bt-lchild); coutdata;/visit(bt); BT_InOrder(bt-rchild); /*=* Function name: BT_PostOrder* Parameter: root:树根节点指针*

10、Precondition: None* Description: 后序遍历* Return value: void=*/void BT_PostOrder(BTNode *bt) if (NULL != bt) BT_PostOrder(bt-lchild); BT_PostOrder(bt-rchild); coutdata;/visit(bt); /*=* Function name: BT_LevelOrder* Parameter: root:树根节点指针* Precondition: NULL != root* Description: 层序遍历* Return value: voi

11、d=*/void BT_LevelOrder(BTNode *bt) queue q; tnode *treePtr; assert( NULL != bt ); q.push(bt); while (!q.empty() treePtr = q.front(); q.pop(); coutdata;/visit(bt); treePtr; if (NULL != treePtr-lchild) q.push(treePtr-lchild); if (NULL != treePtr-rchild) q.push(treePtr-rchild); /先序中序求后序int find(char c,

12、char A,int s,int e) /* 找出中序中根的位置。 */int i;for(i=s;iin_e) return ; /* 非法子树,完成。 */if(in_s=in_e)printf(%c,inin_s); /* 子树子仅为一个节点时直接输出并完成。 */ return ; c=prepre_s; /* c储存根节点。 */ k=find(c,in,in_s,in_e); /* 在中序中找出根节点的位置。 */pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1); /* 递归求解分割的左子树。 */pronum(pre,pre_s+k-in_

13、s+1,pre_e,in,k+1,in_e); /* 递归求解分割的右子树。 */printf(%c,c); /* 根节点输出。 */#include #include #include #include #include #includetree.h#define SIZE 100 using namespace std; typedef struct BiTNode /定义二叉树节点结构 char data; /数据域 struct BiTNode *lchild,*rchild; /左右孩子指针域 BiTNode,*BiTree; int visit(BiTree t); void Cr

14、eateBiTree(BiTree &T); /生成一个二叉树 void PreOrder(BiTree); /递归先序遍历二叉树 void InOrder(BiTree); /递归中序遍历二叉树 void PostOrder(BiTree); /递归后序遍历二叉树 void LeverTraverse(BiTree T);/非递归层次遍历 int TreeDepth(BiTree T) int hl,hr,max; if(T) hl=TreeDepth(T-lchild); /求左深度 hr=TreeDepth(T-rchild); /求右深度 max=hlhr?hl:hr; /取左右深度的

15、最大值 /求结点数return(max+1); else return(0); int TreeNodeNUM(BiTree T) int N=0; int hl,hr,max; if(T) if(T) coutdata; N=N+1;/访问结点 PreOrder(T-lchild); /遍历左子树 PreOrder(T-rchild); /遍历右子树 return N; else return(0); /主函数 void main() BiTree T; char ch; int flag=1; cout二叉树endl; cout请建立二叉树。endl; CreateBiTree(T); /

16、初始化队列 getchar(); while(flag) cout请选择: endl; cout1.先序遍历endl; cout2.中序遍历endl; cout3.后序遍历endl; cout4.层次遍历endl; cout5.树的深度和节点个数endl; cout6.根据前序和中序确定后序endl; cout0.退出程序ch; switch(ch) case 1: if(T) cout递归先序遍历二叉树:; PreOrder(T); coutendl; else cout二叉树为空!endl; break; case 2: if(T) cout递归中序遍历二叉树:; InOrder(T);

17、coutendl; else cout二叉树为空!endl; break; case 3: if(T) cout递归后序遍历二叉树:; PostOrder(T); coutendl; else cout二叉树为空!endl; break; case 4: if (T) cout 层序遍历二叉树:; LeverTraverse(T); cout endl; else cout 二叉树为空!; break; case5:if (T) int depth=0,NodeNum=0; depth=TreeDepth(T); NodeNum=TreeNodeNUM( T); /求树的深度及叶子数 cout

18、树的深度depth 节点个数NodeNumendl; else cout 二叉树为空!; break; case6:if (T) couts0; const char *p0=s0.c_str(); char *pre = new charstrlen(p0)+1; strcpy(pre, p0); couts1; const char *p1=s1.c_str(); char *in = new charstrlen(p1)+1; strcpy(in, p1); cout树的后序为: ; pronum(pre,0,strlen(in)-1,in,0,strlen(pre)-1); else

19、cout 二叉树为空!; break; default: flag=0; cout程序运行结束,按任意键退出!; coutch; /读入一个字符 if(ch=#) T=NULL; else T=(BiTNode *)malloc(sizeof(BiTNode); /生成一个新结点 T-data=ch; CreateBiTree(T-lchild); /生成左子树 CreateBiTree(T-rchild); /生成右子树 /先序遍历的递归 void PreOrder(BiTree T) if(T) coutdata; /访问结点 PreOrder(T-lchild); /遍历左子树 PreO

20、rder(T-rchild); /遍历右子树 /中序遍历的递归 void InOrder(BiTree T) if(T) InOrder(T-lchild); /遍历左子树 coutdata; /访问结点 InOrder(T-rchild); /遍历右子树 /后序遍历的递归 void PostOrder(BiTree T) if(T) PostOrder(T-lchild); /遍历左子树 PostOrder(T-rchild); /访问结点 coutdata; /遍历右子树 void LeverTraverse(BiTree T)/非递归层次遍历 queue Q; BiTree p; p = T; if (visit(p) = 1) Q.push(p); while (!Q.empty() p = Q.front(); Q.pop(); if (visit(p-lchild) = 1) Q.push(p-lchild); if (visit(p-rchild) = 1) Q.push(p-rchild); int visit(BiTree T) if(T) coutdata; return 1; else return 0; 实验结果:

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2