已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*实验三:二叉树遍历操作验证*/#include#include#include#include#include#include#includeusing namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2int LeafNum;/叶子结点个数/定义结构体typedef struct BiTNodechar data;/存放值struct BiTNode *lchild,*rchild;/左右孩子BiTNode,*BiTree;/先序输入二叉树结点的值,空格表示空树void createBiTree(BiTree &T)char ch;/输入结点时用scanf(%c,&ch);if(ch= )/若输入空格,该值为空,且没有左右孩子T=NULL;elseT=(BiTNode *)malloc(sizeof(BiTNode);/分配结点空间if(!T)/分配失败exit(OVERFLOW);T-data=ch;/生成根结点createBiTree(T-lchild);/构造左子树createBiTree(T-rchild);/构造右子树/递归方法先序遍历二叉树void preOrderTraverse(BiTree T)if(T)/若非空if(T-data)/输出printf(%c,T-data);preOrderTraverse(T-lchild);preOrderTraverse(T-rchild);/递归方法中序遍历二叉树void inOrderTraverse(BiTree T)if(T)/若非空preOrderTraverse(T-lchild);if(T-data)/输出printf(%c,T-data);preOrderTraverse(T-rchild);/递归方法后序遍历二叉树void postOrderTraverse(BiTree T)if(T)/若非空preOrderTraverse(T-lchild);preOrderTraverse(T-rchild);if(T-data)/输出printf(%c,T-data);/层序遍历二叉树void LevelTraverse(BiTree T) queue q;/建队 q.push(T);/根节点入队 BiTree p; while(!q.empty() p=q.front(); /获得队列的首元素 q.pop(); /首元素出队 coutdatalchild!=NULL) /若结点的左孩子不空 q.push(p-lchild); if(p-rchild!=NULL)/若结点的右孩子不空 q.push(p-rchild); /非递归方法前序遍历二叉树void stackPreOrderTraverse(BiTree T)stack s;/建栈s.push(T);/根结点入栈BiTree p;/栈首元素while(!s.empty()while(p=s.top()&p)printf(%c,p-data);s.push(p-lchild);/左孩子入栈,直到走到尽头s.pop();/空指针出栈if(!s.empty()p=s.top();/获得栈顶元素s.pop();/出栈s.push(p-rchild);/右孩子入栈/非递归方法中序遍历二叉树void stackInOrderTraverse(BiTree T)stack s;/建栈s.push(T);/入栈BiTree p;/栈首元素while(!s.empty()while(p=s.top()&p)s.push(p-lchild);/左孩子入栈,直到走到尽头s.pop();/空指针出栈if(!s.empty()p=s.top();s.pop();/出栈printf(%c,p-data);s.push(p-rchild);/右孩子入栈/非递归方法后序遍历二叉树void stackPostOrderTraverse(BiTree T)stack s;/建栈map m;/标记结点是否已经输出BiTree p;/栈首元素if(T)/若不是空树s.push(T);/根结点入栈while(!s.empty()while(true)/目的:找到后序遍历要输出的结点while(p=s.top()&p-lchild&!mp-lchild)/若左孩子未输出,将左孩子入栈,直到尽头,不包括空指针s.push(p-lchild);if(p=s.top()&p-rchild&!mp-rchild)/若最左孩子的右孩子未输出且非空,则入栈s.push(p-rchild);elsebreak;/找到结点跳出循环if(p=s.top()&!mp)printf(%c,p-data);mp=true;/标记已经输出s.pop();/退栈/后序遍历求二叉树的高度递归算法int PostTreeDepth(BiTree T) int hl,hr,max;if(T!=NULL) hl=PostTreeDepth(T-lchild); /求左子树的深度 hr=PostTreeDepth(T-rchild); /求右子树的深度 max=hlhr?hl:hr; /得到左、右子树深度较大者 return(max+1); /返回树的深度 else return(0); /如果是空树,则返回0/*按竖向树状打印的二叉树代码是为了实现二叉树的横向显示问题。 这种树形要求先打印右子树,再打印根,最后打印左子树,顺序恰为逆中序顺序。 这种输出格式,结点的左右位置与结点的层深有关, 故算法中设置了一个表示当前根节点层深的参数,以控制输出结点的左右位置。 */void PrintTree(BiTree T,int nLayer) int i; if(T=NULL) return; PrintTree(T-rchild,nLayer+1); for(i=0;idata); PrintTree(T-lchild,nLayer+1);/叶子结点的个数以及元素int TreeLeaf(BiTree T) if(T) if(!T-lchild&!T-rchild) LeafNum+; coutdatalchild); TreeLeaf(T-rchild);return LeafNum;int main()BiTree T;/定义结点int layer=0;/层数while(true)cout输入二叉树结点值空格表示空树:endl;createBiTree(T);cout递归先序遍历:;preOrderTraverse(T);coutendl;cout递归中序遍历:;inOrderTraverse(T);coutendl;cout递归后序遍历:;postOrderTraverse(T);coutendl;cout层序遍历:;LevelTraverse(T);coutendl;cout非递归先序遍历:;stackPreOrderTraverse(T);coutendl;cout非递归中序遍历:;stackInOrderTraverse(T);coutendl;cout非递归后序遍历:;stackPostOrderTraverse(T);coutendl; cout叶子结点为:; cout叶子结点个数为:TreeLeaf(T)endl;cout树的的深度:;layer=PostTreeDepth(T);coutlayerendl;cout二叉树的树形结构图:endl;PrintTree(T,layer);return 0;/*实验三:二叉树遍历操作验证*/#include#include#include#include#include#include#includeusing namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2int LeafNum;/叶子结点个数/定义结构体typedef struct BiTNodechar data;/存放值struct BiTNode *lchild,*rchild;/左右孩子BiTNode,*BiTree;/先序输入二叉树结点的值,空格表示空树void createBiTree(BiTree &T)char ch;/输入结点时用scanf(%c,&ch);if(ch= )/若输入空格,该值为空,且没有左右孩子T=NULL;elseT=(BiTNode *)malloc(sizeof(BiTNode);/分配结点空间if(!T)/分配失败exit(OVERFLOW);T-data=ch;/生成根结点createBiTree(T-lchild);/构造左子树createBiTree(T-rchild);/构造右子树/递归方法先序遍历二叉树void preOrderTraverse(BiTree T)if(T)/若非空if(T-data)/输出printf(%c,T-data);preOrderTraverse(T-lchild);preOrderTraverse(T-rchild);/递归方法中序遍历二叉树void inOrderTraverse(BiTree T)if(T)/若非空preOrderTraverse(T-lchild);if(T-data)/输出printf(%c,T-data);preOrderTraverse(T-rchild);/递归方法后序遍历二叉树void postOrderTraverse(BiTree T)if(T)/若非空preOrderTraverse(T-lchild);preOrderTraverse(T-rchild);if(T-data)/输出printf(%c,T-data);/层序遍历二叉树void LevelTraverse(BiTree T) queue q;/建队 q.push(T);/根节点入队 BiTree p; while(!q.empty() p=q.front(); /获得队列的首元素 q.pop(); /首元素出队 coutdatalchild!=NULL) /若结点的左孩子不空 q.push(p-lchild); if(p-rchild!=NULL)/若结点的右孩子不空 q.push(p-rchild); /非递归方法前序遍历二叉树void stackPreOrderTraverse(BiTree T)stack s;/建栈s.push(T);/根结点入栈BiTree p;/栈首元素while(!s.empty()while(p=s.top()&p)printf(%c,p-data);s.push(p-lchild);/左孩子入栈,直到走到尽头s.pop();/空指针出栈if(!s.empty()p=s.top();/获得栈顶元素s.pop();/出栈s.push(p-rchild);/右孩子入栈/非递归方法中序遍历二叉树void stackInOrderTraverse(BiTree T)stack s;/建栈s.push(T);/入栈BiTree p;/栈首元素while(!s.empty()while(p=s.top()&p)s.push(p-lchild);/左孩子入栈,直到走到尽头s.pop();/空指针出栈if(!s.empty()p=s.top();s.pop();/出栈printf(%c,p-data);s.push(p-rchild);/右孩子入栈/非递归方法后序遍历二叉树void stackPostOrderTraverse(BiTree T)stack s;/建栈map m;/标记结点是否已经输出BiTree p;/栈首元素if(T)/若不是空树s.push(T);/根结点入栈while(!s.empty()while(true)/目的:找到后序遍历要输出的结点while(p=s.top()&p-lchild&!mp-lchild)/若左孩子未输出,将左孩子入栈,直到尽头,不包括空指针s.push(p-lchild);if(p=s.top()&p-rchild&!mp-rchild)/若最左孩子的右孩子未输出且非空,则入栈s.push(p-rchild);elsebreak;/找到结点跳出循环if(p=s.top()&!mp)printf(%c,p-data);mp=true;/标记已经输出s.pop();/退栈/后序遍历求二叉树的高度递归算法int PostTreeDepth(BiTree T) int hl,hr,max;if(T!=NULL) hl=PostTreeDepth(T-lchild); /求左子树的深度 hr=PostTreeDepth(T-rchild); /求右子树的深度 max=hlhr?hl:hr; /得到左、右子树深度较大者 return(max+1); /返回树的深度 else return(0); /如果是空树,则返回0/*按竖向树状打印的二叉树代码是为了实现二叉树的横向显示问题。 这种树形要求先打印右子树,再打印根,最后打印左子树,顺序恰为逆中序顺序。 这种输出格式,结点的左右位置与结点的层深有关, 故算法中设置了一个表示当前根节点层深的参数,以控制输出结点的左右位置。 */void PrintTree(BiTree T,int nLayer) int i; if(T=NULL) return; PrintTree(T-rchild,nLayer+1); for(i=0;idata); PrintTree(T-lchild,nLayer+1);/叶子结点的个数以及元素int T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年陕西省安康市医疗系统事业编人员招聘笔试参考题库及答案详解
- 2026年遂宁市安居区政务服务中心(窗口人员)招聘考试备考试题及答案详解
- 2026年遂宁市船山区政务服务中心(窗口人员)招聘考试参考题库及答案详解
- 2026年山东省潍坊市医疗系统事业编人员招聘笔试参考题库及答案详解
- 2026年西安市莲湖区医疗系统事业编人员招聘笔试备考题库及答案详解
- 2026年青海省西宁市政务服务中心(窗口人员)招聘考试参考试题及答案详解
- 房屋装修补充合同
- 2026年梧州市蝶山区工会人员招聘考试参考题库及答案详解
- 2026年台州市椒江区政务服务中心(窗口人员)招聘考试备考题库及答案详解
- 2026年河北省承德市政务服务中心(窗口人员)招聘笔试备考试题及答案详解
- 2026年秋季初中开学第一课 行为规范 青春有规
- 《医疗器械经营质量管理规范》培训试题及答案
- 2026年金融科技产品推广方案
- 成都市新都区2026年社区网格员招录考试真题库及完整答案
- 城市更新项目策划与实施方案
- 湖南省长沙市望城区2027届六年级数学第一学期期末联考试题含解析
- 2026统考专升本高数:高数Ⅰ考点汇编
- 校长竞聘面试答辩题及答案(精心)
- 2025年特殊教育学校教师招聘笔试试题及答案
- 2026-2027年人工智能(AI)驱动的个性化国际税务筹划与合规风险预警平台适应全球税收规则变化获金融与法律科技投资
- 2026一级建造师《机电》必背知识点
评论
0/150
提交评论