二叉树的各种遍历及直观打印.docx
- 文档编号:24827257
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:15
- 大小:105.61KB
二叉树的各种遍历及直观打印.docx
《二叉树的各种遍历及直观打印.docx》由会员分享,可在线阅读,更多相关《二叉树的各种遍历及直观打印.docx(15页珍藏版)》请在冰豆网上搜索。
二叉树的各种遍历及直观打印
一.引言2
1.摘要2
2.关键字2
二.正文
1.需求分析2
2.数据结构2
3.算法设计3
3.1概要设计3
3.2详细设计4
4.调试分析6
5.测试结果6
6.源程序9
7.不足之处15
8.
设计体会16
一.引言
二叉树是树形结构的一个重要类型,许多实际问题抽象出来的
数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,因此,二叉树显得特别重要。
(一).摘要
本算法能创建二叉树,满足对二叉树的层序遍历,并打印层序遍历序列;亦能求出二叉树的深度、叶子数、节点数,并能在WINDOWS控制台上打印二叉树。
(二).关键字
二叉树、遍历、打印、递归、队列
二.正文
(一).需求分析
1.问题描述
设计一个二叉树的遍历以及求二叉树深度、节点数、叶子数的程序,该程序有打印二叉树的功能。
2.功能建立二叉树,能够输出二叉树的层序遍历序列,并能求出二叉树的深度、节点数、叶子数和打印二叉树。
3.要求分别建立二叉树存储结构的输入函数、输出层序遍历序列的函数、输出二叉树深度、节点数、叶子数的函数、打印二叉树的函数。
(三).数据结构
存储结构采用了链式存储,属于链式存储结构:
typedefstructnode{datatypedata;
structnode*lchild,*rchild;
}BinTNode;
(四).算法设计
1.概要设计
本程序要实现对二叉树的层次遍历以及求解二叉树的深度、节点数、叶子树的算法,并且在程序中要建立二叉树,打印二叉树形状。
本程序中用到的函数:
Creatree()
操作结果:
建立一个新的二叉树
VoidTreeDepth()
操作结果:
求二叉树的深度、结点数及叶子数
VoidLevelorder()
操作结果:
层序遍历二叉树,得出二叉树的层序遍历序列
Voidprint()
操作结果:
在windows控制台上打印二叉树
主函数流程以及各模块间的关系:
主函数
(main)
2.详细设计
深度、节点、叶子
(TreeDepth)
每个操作的伪码算法
(1)BnTNodecreatree()
lf(ch!
二‘@)
分配内存
s->data=ch;
if(rear=1)
root二s;
else{左孩子=s;或者右孩子=s
}
(2)intTreeDepth()
h1为左深度,h2为右深度;
二叉树深度为h1、h2的最大值加1;
节点数二节点数+1(节点数初始值为0);
If(h1==0&&h2=0
叶子数加1;
3)voidLevelorder()
根入队;
while(front!
=rear)
front出队,输出节点;
if(左孩子不空)
左孩子入队;
If(右孩子不空)
右孩子入队;
4)voidprint_btree()
If(T!
=NULL)
递归打印右子树、level+1;
for(i=0;i 输出节点; 递归打印右子树、level+1; 4)voidprint() 调用print_btree(); (5)main() 调用creatree()建立二叉树;do {输入0-5个菜单选择; switch(i) case (1): 创建二叉树; case (2): 调用TreeDepth()求树的深度、叶子树、及节点数; case(3): 调用Levelorder()输出层序遍历二叉树的序列;case(4): 调用print()打印二叉树; case(0): break; }while(i! =0); (5).调试分析 a.在第二次创建二叉树之后求叶子与节点时,输出结果是第一次的输出结果,在主函数中在调用TreeDepth()函数前,将叶子数和节点树置为0,就解决此问题。 b.同一棵二叉树调用TreeDepth()函数,输出的叶子数和节点数会成倍的增长,同样的在调用此函数前将节点数和叶子数置0. (6).调试结果 根据提示输入二叉树序列,运行情况如下: 输入12345@@@@67# a.求二叉树的深度、叶子数、节点数,运行结果如下: 节点数及叶子数 斗MK員■;select1: 刨建二叉械釦输出二叉树命踵3: 层次遍历二叉旃: ;舉二叉树 岂叉树深度Y节点数T叶子数T ■—__—_1—.a—as—ns—ci—as—s'a—cs_Ji 创虑二 输出二* ^^次逋=■ 細二叉树 IKE.iMHWtJMKtCK. 节点.数及叶子数 ML-MXM b.层次遍历二叉树,运行结果如下: 二叉树棵度=4节点数=7叶子数=4 1: 创建二叉耐 型输出二叉树幽裸底,节点数及叶子数 3=启次遍话二叉亦 •―二叉树 4: 0: 层次遍历序列: 1234567 ・*■#■笛.■■出誓梓互14戶■话.管■笛誓■甘 1 2 3 4 Q 蹩讓騎"叶子数 盟二抄 rl C.打印 运行情况如下 ■■■if型UKiBiriHselee>rfci*it 1=僧瞳二叉妁 补输出二夏树餡深虞’节点数及叶子数 3=层次遍历二叉矿 4,打甲二叉树 0: 邁由 •><些甌耳1<1|~些竺耳斗列耳if-if■其■«-*! < 屮pw*mh**h*wgelect 节点数及叶子数 1=创建二民树 3=层次遍历二叉櫛 4=打印二叉树 «: 邁由 A.创建新的二叉树•并输出深度,节点数,叶子数;运行结果如下: B.层次遍历新二叉树,并打印二叉树,运行结果如下: 打印二叉树 JKKJaJtKJCXJitMM: SeleCtJOCKJOfXJCXJCMKJC1: 创建二叉树 辰次遍历序列: ABCDEFGHI JtJCJCJtB[: >tMKS号leCt誉-MHMTHCM: M: ItJtMM: JC I: 仓腱二X林 鉄输出二叉哋琨聡节点数及叶子数3=层我殖历二夏轿4: 打用二支树 0=退由 (七).不足之处 在windows控制台上打印二叉树时,是按中序遍历打印的,打印的树形结构(右子数在上,左子数在下,根在最左边)要通过旋转90度才能看到我们平日看到的树形二叉树(根在上,左右子数在下)。 (八).设计体会 经过了两个周的学习,通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。 把死板的课本知识变得生动有趣,激发了学习的积极性。 把学过的c语言知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。 加深了对c语言和数据结构的巩固,在学习中不仅仅是局限于课本知识,更要懂得查阅资料,不论基础有多扎实,都要查阅相关书 籍,查阅资料,找到更好的解决方法。 四.参考文献 《数据结构课程设计案例精编》李建学等主编清华大学出版社2007《c程序设计》谭浩强主编清华大学出版社2005 《数据结构c语言版》严蔚敏主编清华大学出版社2009 五.附录(源程序) #include"stdio.h"#include"malloc.h"#include"stdlib.h" #include"stddef.h" #defineMax20/*结点的最大个数*/ typedefintdatatype; typedefstructnode{datatypedata; intnum; structnode*lchild,*rchild; }BinTNode;/*自定义二叉树的结点类型*/ BinTNode*q[Max]; typedefBinTNode*BinTree;/*定义二叉树的指针*/intNodeNum,leaf;/*NodeNum为结点数,leaf为叶子数*/inta=0; BinTNode*creatree() {charch; intfront,rear; BinTNode*s,*root; root=NULL; front=1; rear=0; printf("虚节点用@表示,以#结束\n"); printf("请输入一棵二叉树序列! \n");ch=getchar(); while(ch! ='#') {s=NULL; if(ch! ='@') {s=malloc(sizeof(BinTNode)); s->data=ch;s->lchild=s->rchild=NULL; } rear++; q[rear]=s; if(rear==1) root=s; else {if(s&&q[front]) if(rear%2==0) q[front]->lchild=s; else q[front]->rchild=s; if(rear%2==1) front++; } ch=getchar(); } returnroot; } /*=====采用后序遍历求二叉树的深度、叶子结点数及数的递归算法========*/ intTreeDepth(BinTreeT) { inthl,hr,max; if(T){ hl=TreeDepth(T->lchild);/*求左深度*/ hr=TreeDepth(T->rchild);/*求右深度*/ max=hl>hr? hl: hr;/*取左右深度的最大值*/NodeNum=NodeNum+1;/*求结点数*/ */ return(max+1); }elsereturn(0); } /*====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========*/voidLevelorder(BinTreeT) {intfront=0,rear=1; BinTNode*cq[Max],*p;/*定义结点的指针数组cq*/cq[1]=T;/*根入队*/ while(front! =rear) {front=(front+1)%NodeNum; p=cq[front];/*出队*/printf("%c",p->data);/*出队,输出结点的值*/ if(p->lchild! =NULL){ rear=(rear+1)%NodeNum; cq[rear]=p->lchild;/*左子树入队(指针替换)*/ } if(p->rchild! =NULL){rear=(rear+1)%NodeNum; cq[rear]=p->rchild;/*右子树入队*/ }}} voidprint_btree(BinTreeT,intlevel) {inti=0; if(T==NULL)return;print_btree(T->rchild,level+1); //缩进level*2个字符for(i=0;i //假设你的二叉树的结点存放的是一个字符printf("%c\n",T->data); print_btree(T->lchild,level+1); }//打印二叉树 voidprint(BinTreeT) { print_btree(T,0); } /*==========主函数=================*/ main() { BinTreeroot; inti,j=0,depth,nLayer; root=NULL; printf("\n"); root=creatree();/*创建二叉树,返回根结点*/ do{/*从菜单中选择遍历方式,输入序号。 */ printf("\t1: 创建二叉树\n"); printf("\t2: 输出二叉树的深度,节点数及叶子数\n"); printf("\t3: 层次遍历二叉树\n");/*按层次遍历之前,先选择 printf("\t**********select ************ \n"); 4,求出该树的结点数*/ printf("\t4: 打印二叉树\n"); printf("\t0: 退出\n"); scanf("%d",&i);/*输入菜单序号(0-5)*/ getchar(); switch(i){ case1: printf("创建二叉树: "); printf("\n");root=creatree(); break; case2: NodeNum=0;leaf=0;depth=TreeDepth(root);/*求树的深 度及叶子数*/ printf("二叉树深度=%d节点数=%d",depth,NodeNum); printf("叶子数=%d",leaf); break; case3: printf("层次遍历序列: "); Levelorder(root);/* 按层次遍历*/ break; case4: printf("打印二叉树: \n");print(root); break; case0: break; default: puts("again"); } printf("\n"); } while(i! =0); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 各种 遍历 直观 打印