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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构二叉树操作遍历树形输出.docx

1、数据结构二叉树操作遍历树形输出/* 实验三:二叉树遍历操作考证 */#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 crea

2、teBiTree(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-

3、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);

4、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);/非递归方法前序遍历二叉树voi

5、d 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; /

6、建栈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.p

7、ush(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(); /退栈/后序遍历求二

8、叉树的高度递归算法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); /返回树的深度elsereturn(0); / 假如是空树,则返回 0/* 按竖向树状打印的二叉树代码是为了实现二叉树的横向显示问题。这类树形要求先打印右子树,再打印根,最后打印左子树,次序恰为逆中序次序。这类输出格式,结点的左右地点与结点

9、的层深相关,故算法中设置了一个表示目前根节点层深的参数,以控制输出结点的左右地点。 */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

10、 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);co

11、utendl;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#i

12、nclude#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= ) / 若输入空格,该

13、值为空 ,且没有左右孩子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);preOrderTraver

14、se(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);/层序遍历二叉树v

15、oid 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;/根结点入

16、栈/栈首元素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

17、(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

18、()&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=PostTree

19、Depth(T-lchild); / 求左子树的深度hr=PostTreeDepth(T-rchild); / 求右子树的深度max=hlhr?hl:hr; / 获取左、右子树深度较大者return(max+1); /返回树的深度elsereturn(0); / 假如是空树,则返回 0/* 按竖向树状打印的二叉树代码是为了实现二叉树的横向显示问题。这类树形要求先打印右子树,再打印根,最后打印左子树,次序恰为逆中序次序。这类输出格式,结点的左右地点与结点的层深相关,故算法中设置了一个表示目前根节点层深的参数,以控制输出结点的左右地点。 */void PrintTree(BiTree T,int

20、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 输入二叉树结点值空格表示空树: en

21、dl;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;

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

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