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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(数据结构二叉树的操作遍历及树形输出.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至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 BiTNode char data; /存放值 struct BiTNode *lchild,*rchild; /左右孩子BiTNode,*BiTree;/先序输入二叉树结点的值,空格表示空树void cre

2、ateBiTree(BiTree &T) char ch; /输入结点时用 scanf(%c,&ch); if(ch= ) /若输入空格,该值为空,且没有左右孩子 T=NULL; else T=(BiTNode *)malloc(sizeof(BiTNode); /分配结点空间 if(!T) /分配失败 exit(OVERFLOW); T-data=ch; /生成根结点 createBiTree(T-lchild); /构造左子树 createBiTree(T-rchild); /构造右子树 /递归方法先序遍历二叉树void preOrderTraverse(BiTree T) if(T) /

3、若非空 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) /若非空 preOrd

4、erTraverse(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.pu

5、sh(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); /右孩子入栈 /非递归方法中序遍历二叉树voi

6、d 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

7、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); else break; /找到结点跳出循环 if(

8、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/*按竖向树状打印的二

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

10、(!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

11、); 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二叉

12、树的树形结构图: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 BiTNode char data; /存放值 struct BiTNode *lchild,*rchild; /左右孩子BiTNode,*BiTree;/

13、先序输入二叉树结点的值,空格表示空树void createBiTree(BiTree &T) char ch; /输入结点时用 scanf(%c,&ch); if(ch= ) /若输入空格,该值为空,且没有左右孩子 T=NULL; else T=(BiTNode *)malloc(sizeof(BiTNode); /分配结点空间 if(!T) /分配失败 exit(OVERFLOW); T-data=ch; /生成根结点 createBiTree(T-lchild); /构造左子树 createBiTree(T-rchild); /构造右子树 /递归方法先序遍历二叉树void preOrder

14、Traverse(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(B

15、iTree 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-rc

16、hild!=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

17、); /右孩子入栈 /非递归方法中序遍历二叉树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 stackPostOrde

18、rTraverse(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);

19、 else break; /找到结点跳出循环 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(

20、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

21、reeLeaf(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递归

22、后序遍历:; 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