完全二叉树操作演示Word文档下载推荐.docx
- 文档编号:15381331
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:14
- 大小:149.32KB
完全二叉树操作演示Word文档下载推荐.docx
《完全二叉树操作演示Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《完全二叉树操作演示Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
(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<
stdio.h>
stdlib.h>
string.h>
node*r;
intCreatTree(Tree&
t)
inti;
t.r=(node*)malloc(MAX*sizeof(node));
//r[MAX]
printf("
请输入完全二叉树节点个数,输入后继续:
"
);
scanf("
%d"
&
t.length);
请输入完全二叉树节点,以字母空格隔开且不要以空格开头:
for(i=0;
i<
t.length;
i++)
getchar();
scanf("
%c"
t.r[i+1].dat);
}
return1;
intLevCount(intn)//统计每层最多节点个数
intp=1;
for(inti=1;
=n;
p=p*2;
returnp;
voidOutputTree(Tree&
intk=0,n=t.length;
//求树的层数K
while(n)
k++;
n=n/2;
}//层数控制行每层节点个数控制列
for(inti=1;
=k;
i++)//j<
LevCount(i)-LevCount(i-1)&
&
LevCount(i-1)+j<
=t.length
{//判断条件是每层节点个数且以最左边孩子节点开始不小于表长
for(intj=0;
j<
=t.length;
j++)printf("
%2c"
t.r[LevCount(i-1)+j].dat);
//输出每层各个节点
printf("
\n"
}
voidDepth(Tree&
intk=0,n=t.length;
二叉树深度:
%2d\n"
k);
voidLeaf(Tree&
intlef;
lef=(t.length+1)/2;
叶子节点个数:
lef);
voidPreOrder(Tree&
t,intr)//先序遍历DLR
if(t.length<
r)return;
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);
InOrder(t,2*r+1);
voidPostOrder(Tree&
t,intr)//后序遍历LRD
r)return;
PostOrder(t,2*r);
PostOrder(t,2*r+1);
voidLeOrder(Tree&
inti;
t.r[i+1].dat);
voidSearch(Tree&
boolflag=false;
请输入查找节点:
q);
for(i=1;
if(t.r[i].dat==q)//找到给定节点下标且默认节点0号单元无节点
if(i/2==0)//根节点无双亲
此节点无双亲"
else
此节点的双亲:
%c"
t.r[i/2].dat);
if(2*i>
t.length)//左孩子下标值大于表长,肯定无孩子
此节点无左右孩子"
此节点左孩子:
t.r[2*i].dat);
if(2*i+1>
t.length)//右孩子下标值大于表长,只是无右孩子
此节点无右孩子"
此节点右孩子:
t.r[2*i+1].dat);
}
flag=true;
break;
if(flag==false)
二叉树中没有此节点\n"
voidmenu()
*****************************菜单************************************\n"
\n"
1.创建完全二叉树2.显示完全二叉树\n"
3.完全二叉树深度4.完全二叉树层次遍历\n"
5.完全二叉树的前序、中序、后序6.查找给定结点双亲、左右孩子\n"
7.完全二叉树叶子结点数8.退出系统\n"
请先对菜单1操作后,再进行其它操作\n"
voidmain()
Treet;
intc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完全 二叉 操作 演示