完全二叉树操作演示.docx
- 文档编号:2464404
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:14
- 大小:149.32KB
完全二叉树操作演示.docx
《完全二叉树操作演示.docx》由会员分享,可在线阅读,更多相关《完全二叉树操作演示.docx(14页珍藏版)》请在冰豆网上搜索。
完全二叉树操作演示
安徽省巢湖学院计算机与信息工程学院
课程设计报告
课程名称《数据结构》
课题名称完全二叉树操作演示
专业班级计算机科学与技术专升本1班
学号********、********、********
姓名李鹏王帅李泳波
联系方式
指导教师严小燕
完成日期:
2014年12月27日
1数据结构课程设计任务书
1.1题目
完全二叉树操作演示
1.2目的
(1)掌握二叉树的概念和性质。
(2)掌握完全二叉树存储结构。
(3)掌握完全二叉树的基本操作。
1.3要求
(1)创建完全二叉树(用字母表示节点)(用顺序方式存储)。
(2)求二叉树的深度和叶子结点数。
(3)实现二叉树的前序、中序、后序和层次遍历。
(4)查找给定结点的双亲、祖先和左右孩子节点。
2总体设计
2.1功能模块设计
根据课程设计题目的功能要求,各个功能模块的组成框图如图1:
图1功能组成框图
2.2所有功能模块流程图
设计好功能模块后,各个模块的关系如下图2:
图2流程图
3详细设计
3.1程序中所采用的数据结构及存储结构的说明
(1)整个程序采用结构体与顺序表相结合的编程方法一共完成了7个功能。
在你输入错误时有报错消息,这样使整个程序运行起来更加完整。
程序中有若干个子函数被主函数调用执行。
结构体定义如下:
#defineMAX100//定义100个节点
typedefstruct
{
chardat;//节点信息
}node;
typedefstructTree//节点组成树
{
intlength;
node*r;//指向根节点
}Tree;
3.2算法设计思想
完全二叉树具有以下几个性质,由此可设计出相应算法。
性质1完全二叉树约定编号从根节点起,自上而下,自左自由。
由此设计出顺序存储结构且进行层次遍历时,只需输出顺序表中存储的元素即可。
性质2具有n个结点的完全二叉树的深度为。
由此设计出深度计算函数。
性质3完全二叉树第i层上的结点数目最多为2i-1(i≥1)。
由此设计出每层节点个数函数,在显示完全二叉树时可以找到其最左边的孩子节点。
性质4在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点且叶子节点个数为(n+1)/2。
由此设计出叶子节点函数。
性质5在完全二叉树中,若根节点为i,则左孩子节点为2i,右孩子节点为2i+1。
由此采用递归思想,可以对完全二叉树进行前序、中序、后序遍历和给定节点找其双亲及孩子。
3.3主要的功能函数
CreatTree(Tree&t)//创建完全二叉树
LevCount(intn)//统计每层最多节点个数
OutputTree(Tree&t)//显示完全二叉树
Depth(Tree&t)//求树深
Leaf(Tree&t)//叶子节点
PreOrder(Tree&t,intr)//先序遍历
InOrder(Tree&t,intr)//中序遍历
PostOrder(Tree&t,intr)//后序遍历
LeOrder(Tree&t)//层次遍历
Search(Tree&t,charq)//查找给定结点的双亲、左右孩子
完善以上函数,就可以设计出完全二叉树的操作了。
4调试与测试
4.1调试方法与步骤
第一步:
建立完全二叉树,输入节点个数和节点。
第二步:
选择要操作的对象,比如显示完全二叉树,按下电脑键盘1。
查找双亲及孩子功能函数在操作时需要输入信息,按照相应提示输入相应信息即可运行,输入不对时,程序会有报错提示信息。
4.2测试结果分析与讨论
假定完全二叉树节点数为9个,节点信息为a、b、c、d、e、f、g、h、i。
操作结果如下图所示:
(1)操作界面
图3操作界面
(2)创建完全二叉树
图4创建完全二叉树
(3)显示完全二叉树
图5显示完全二叉树
(4)完全二叉树深度
图6完全二叉树深度
(5)完全二叉树层次遍历
图7完全二叉树层次遍历
(6)完全二叉树前序、中序、后序
图8前序、中序、后序遍历
(7)查找给定节点双亲及孩子
图9查找给定节点双亲及孩子
(8)完全二叉树叶子节点数
图10节点数
4.3测试过程中遇到的主要问题及采取的解决措施
在建立完全二叉树时操作不当会出现程序错误。
如下图:
图11错误界面
导致以上错误的原因是,再输入第一个字母元素时,不能空格,程序中的getchar()函数只能接收上一个空格字符,即输入节点产生的空格,解决方法是重新编译运行程序按要求输入即可。
5时间复杂度分析
这里主要分析查找节点时的时间复杂度,当给定节点时,需要在顺序表中进行一一比对查找,即顺序查找,那么最坏的情况就是找最后一个叶子节点了,这就跟表长有关系了,所以时间复杂度为n=length。
6程序清单
#include
#include
#include
#defineMAX100//定义100个节点
typedefstruct
{
chardat;//节点信息
}node;
typedefstructTree//节点组成树
{
intlength;
node*r;//指向根节点
}Tree;
intCreatTree(Tree&t)
{
inti;
t.r=(node*)malloc(MAX*sizeof(node));//r[MAX]
printf("请输入完全二叉树节点个数,输入后继续:
");
scanf("%d",&t.length);
printf("请输入完全二叉树节点,以字母空格隔开且不要以空格开头:
");
for(i=0;i { getchar(); scanf("%c",&t.r[i+1].dat); } return1; } intLevCount(intn)//统计每层最多节点个数 { intp=1; for(inti=1;i<=n;i++) p=p*2; returnp; } voidOutputTree(Tree&t)//显示完全二叉树 { intk=0,n=t.length;//求树的层数K while(n) { k++; n=n/2; }//层数控制行每层节点个数控制列 for(inti=1;i<=k;i++)//j {//判断条件是每层节点个数且以最左边孩子节点开始不小于表长 for(intj=0;j printf("\n"); } } voidDepth(Tree&t)//求树深 { intk=0,n=t.length; while(n) { k++;n=n/2; } printf("二叉树深度: %2d\n",k); } voidLeaf(Tree&t)//叶子节点 { intlef; lef=(t.length+1)/2; printf("叶子节点个数: %2d\n",lef); } voidPreOrder(Tree&t,intr)//先序遍历DLR { if(t.length printf("%c",t.r[r].dat); PreOrder(t,2*r); PreOrder(t,2*r+1); } voidInOrder(Tree&t,intr)//中序遍历LDR { if(t.length InOrder(t,2*r); printf("%c",t.r[r].dat); InOrder(t,2*r+1); } voidPostOrder(Tree&t,intr)//后序遍历LRD { if(t.length PostOrder(t,2*r); PostOrder(t,2*r+1); printf("%c",t.r[r].dat); } voidLeOrder(Tree&t)//层次遍历 { inti; for(i=0;i printf("%c",t.r[i+1].dat); printf("\n"); } voidSearch(Tree&t,charq)//查找给定结点的双亲、左右孩子 { boolflag=false; inti; printf("请输入查找节点: "); getchar(); scanf("%c",&q); for(i=1;i<=t.length;i++) { if(t.r[i].dat==q)//找到给定节点下标且默认节点0号单元无节点 { if(i/2==0)//根节点无双亲 printf("此节点无双亲"); else printf("此节点的双亲: %c",t.r[i/2].dat); if(2*i>t.length)//左孩子下标值大于表长,肯定无孩子 printf("此节点无左右孩子"); else { printf("此节点左孩子: %c",t.r[2*i].dat); if(2*i+1>t.length)//右孩子下标值大于表长,只是无右孩子 printf("此节点无右孩子"); else { printf("此节点右孩子: %c",t.r[2*i+1].dat); } } flag=true; break; } } if(flag==false) printf("二叉树中没有此节点\n"); printf("\n"); } voidmenu() { printf("*****************************菜单************************************\n"); printf("\n"); printf("\n"); printf("1.创建完全二叉树2.显示完全二叉树\n"); printf("\n"); printf("3.完全二叉树深度4.完全二叉树层次遍历\n"); printf("\n"); printf("5.完全二叉树的前序、中序、后序6.查找给定结点双亲、左右孩子\n"); printf("\n"); printf("7.完全二叉树叶子结点数8.退出系统\n"); printf("\n"); printf("\n"); printf("请先对菜单1操作后,再进行其它操作\n"); } voidmain() { Treet; intc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完全 二叉 操作 演示