数据结构课程设计二叉树平衡的判定Word格式.docx
- 文档编号:20693456
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:17
- 大小:112.06KB
数据结构课程设计二叉树平衡的判定Word格式.docx
《数据结构课程设计二叉树平衡的判定Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计二叉树平衡的判定Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
在我们这个判定任意给定的二叉树的题中。
我们处理这道题的主要的思路是:
首先按先序和中序或者按中序和后序的方式将我们所要判断的二叉树输入进入,目的是要得到一个明确的二叉树的结构准确的判断二叉树是否平衡。
在我们判断二叉树的平衡中我们将分别考虑二叉树左右子树的是不是为平衡二叉树,依次得到左右子树的深度,判断左右子树的平衡性。
在我们的设计思路中我们将用到不同的树的遍历方式。
二、问题重叙:
平衡二叉树的判断,设计要求给定一个先序或者后序的遍历结果,判断其是否为二叉树。
问题分析:
在处理二叉树平衡的判断的问题中。
我们需要将分别考虑二叉树的左右子树的平衡问题只要左右子树确定为平衡二叉树,而且左右子树的深度的绝对值之差不大于1,那么我们得到的就是一颗平衡的二叉树。
我们将先通过前序和中序或者中序和后序将所要判断的二叉树输入。
建立一个明确的二叉树在此基础上判断二叉树是否为平衡二叉树。
我们先建立一个二叉树并用前序和中序或者中序和后序遍历的方式将我们输入的树的元素输入得到一个明确的树的结构。
三、流程图如下:
四、模块分析:
1、定义一个结构体存储各节点的信息,并且用递归的方法存储左右子树的信息
typedefstructBINTREE
{
charchData;
structBINTREE*pbLChild;
structBINTREE*pbRChild;
}BinTree,*pBinTree;
2、分别得到树的深度以及左右子树的深度
intBT_GetTreeDepth(pBinTreepbTree)
//存储树总的深度
intiDepthTotal=0;
//存储左子树的深度
intiDepthLeft=0;
//存储右子树的深度
intiDepthRight=0;
if(pbTree==NULL)
{
iDepthTotal=0;
}
else
//左孩子的深度
iDepthLeft=BT_GetTreeDepth(pbTree->
pbLChild);
//右孩子的深度
iDepthRight=BT_GetTreeDepth(pbTree->
pbRChild);
//去左右孩子深度的最大值,1代表着根节点
iDepthTotal=1+(iDepthLeft>
iDepthRight?
iDepthLeft:
iDepthRight);
returniDepthTotal;
}
3、判断左右子树是不是为平衡二叉树
boolBT_IsBalanceTree(pBinTreepbTree)
//如果树不是空的
if(pbTree!
=NULL)
//存储左孩子的深度
intiLeftDepth=0;
//存储右孩子的深度
intiRightDepth=0;
//得到左孩子的深度
iLeftDepth=BT_GetTreeDepth(pbTree->
//得到右孩子的深度
iRightDepth=BT_GetTreeDepth(pbTree->
//判断树是不是平衡二叉树平衡二叉树的左右孩子的深度绝对值只差不大于
if((iLeftDepth-iRightDepth>
=-1)&
&
(iLeftDepth-iRightDepth<
=1))
//判断左子树是不是平衡的
BT_IsBalanceTree(pbTree->
//判断右子树是不是平衡的
returnfalse;
returntrue;
4、输入各节点元素
boolBT_PreInToTree(pBinTree&
pbTree,char*szInOrder,char*szPreOrder,intiInLeft,intiInRight,intiPreLeft,intiPreRight)
BT_PreInToTree(pbTree->
pbLChild,szInOrder,szPreOrder,iInLeft,iCurPos-1,iPreLeft+1,iPreLeft+iLegnthLeft);
5、前序遍历二叉树
voidBT_PreOrder(pBinTreepbTree)
{
if(pbTree!
//Thepreordertraversalis,root,leftchild,rightchild
printf("
%c"
pbTree->
chData);
BT_PreOrder(pbTree->
}
6、后序遍历二叉树
voidBT_PostOrder(pBinTreepbTree)
//Thepostordertraversalis,leftchild,rightchild,root
BT_PostOrder(pbTree->
pbLChild);
pbRChild);
7、主函数
voidmain()
charszPre[100]="
"
;
charszMid[100]="
charszPost[100]="
pBinTreepbPreInTree;
pBinTreepbPostInTree;
(1)选用前序和后序的输出方式,并判断是不是平衡二叉树
printf("
请输入前序序列:
\n"
);
scanf("
%s"
&
szPre);
请输入中序序列:
szMid);
boolbCorrect=BT_PreInToTree(pbPreInTree,szMid,szPre,0,strlen(szMid)-1,0,strlen(szPre)-1);
if(bCorrect)
{printf("
该树的后序序列为:
BT_PostOrder(pbPreInTree);
if(BT_IsBalanceTree(pbPreInTree))
该树是平衡二叉树"
这个不是平衡二叉树"
不要乱输,前序与中序不匹配"
break;
(2)选用中序和后序输入方式,并判断是不是平衡二叉树
scanf("
szMid);
printf("
请输入后序序列:
szPost);
boolbCorrect=BT_InPostToTree(pbPostInTree,szMid,szPost,0,strlen(szMid)-1,0,strlen(szPost)-1);
{printf("
该树的前序序列为:
BT_PreOrder(pbPostInTree);
if(BT_IsBalanceTree(pbPostInTree))
不要乱输,中序与后序不匹配"
default:
不要乱选,不支持其他模式"
五、算法实现效果图:
1、选用输入方式:
2、中序
3、后序输入
4、得到结果
5、输入的中序和后序不匹配
6、得到正确的结果
六、总结:
在此次课程设计过程中我们成功的利用树的遍历以及二叉树成立的条件判断了随意的二叉树是为平衡二叉树。
其实在于计算机语言这类课程看重的就是上机的实际操作,不满足于基本理论的学习。
上机操作才能让我们更加好的掌握我们所要学习的计算机语言知识。
我们在此次程序设计中首先分析问题所要的关键然后找到题目所涉及的知识点,了解知识的结构在此基础上选用正确的方法画出我们解决问题的流程图。
接着我们在流程图的基础上编写代码将我们所要实现的目的在计算机上实现。
我们在解决我们问题的过程中通过前序和中序或者中序和后序的方式将树输入,再将其以后序或者前序的方式将其输出。
在判断是不是为平衡二叉树时我们分别检索左右子树的深度判断左右子树是不是平衡二叉树,并且比较左右子树的深度,看看它们之间的绝对值之差是不是小于1的。
最终得到我们所输入的二叉树是不是平衡二叉树。
在我们输入的过程中为了得到正确的结构,我们所输入的前序和中序必须是匹配的或者中序和后序是匹配的,只有这样才能得到一个明确的树的结构。
七、心得体会:
我们的专业决定了我们跟计算机结缘,这样我们也就与计算机语言结缘啦。
我们将会在以后的学习生涯中不断学习计算机语言的知识。
因而我们要懂得学习计算机语言的正确的方法这是才能事半功倍。
上机编程看起来是件很单调很无聊的事情,但是只要我们能够沉下心来,认真的处理自己需要解决的问题就能从这其中得到无穷的乐趣!
!
八、参考文献:
1、刘玉龙数据结构与算法实用教程电子工业出版社
2、谭浩强C语言程序设计清华大学出版社
3、严蔚敏数据结构清华大学出版社
九、附录
源程序如下:
#include<
stdio.h>
malloc.h>
string.h>
//Depthofleftchild左孩子的深度
//Depthofrightchild右孩子的深度
//Getthemaxdepthofleftandrightchild,1meansrootnode去左右孩子深度的最大值,1代表着根节点
//Iftreeisnotempty如果树不是空的
//Storetheleftchilddepth存储左孩子的深度
//Storetherightchilddepth存储右孩子的深度
//Gettheleftchilddepth得到左孩子的深度
//Gettherightchilddepth得到右孩子的深度
//Judgethetreeisbalancetreeornot判断树是不是平衡二叉树平衡二叉树的左右孩子的深度绝对值只差不大于1
//Thebalancetreeistheabstractofleftchilddepthreducerightchilddepthisequalorlessthan1
//Judgetheleftchildisbalancetoo判断左子树是不是平衡的
//Judgetherightchildisbalancetoo判断右子树是不是平衡的
//Createnode创建一个节点
pbTree=newBinTree;
pbTree->
chData=szPreOrder[iPreLeft];
pbLChild=pbTree->
pbRChild=NULL;
//Storecurrentposition
intiCurPos=iInLeft;
//Findthenodethesameaspreorder找到先前已经访问的节点
while((iCurPos<
=iInRight)&
(szInOrder[iCurPos]!
=szPreOrder[iPreLeft]))
iCurPos++;
//Ifthecurrentpositionisgreaterthantherightborder,returnfalse
if(iCurPos>
iInRight)
intiLegnthLeft=iCurPos-iInLeft;
//Ifcurrentpositionisgreaterthanleft,generateleftchild
iInLeft)
//ifcurrentpositionislessthanright,generaterightchild
if(iCurPos<
BT_PreInToTree(pbTree->
pbRChild,szInOrder,szPreOrder,iCurPos+1,iInRight,iPreLeft+iLegnthLeft+1,iPreRight);
boolBT_InPostToTree(pBinTree&
pbTree,char*szInOrder,char*szPostOrder,intiInLeft,intiInRight,intiPostLeft,intiPostRight)
//Createnode
chData=szPostOrder[iPostRight];
pbLChild=pbTree->
//Storecurrentposition
//Findthenodethesameaspostorder
while(iCurPos<
=iInRight&
szInOrder[iCurPos]!
=szPostOrder[iPostRight])
iCurPos++;
iInRight)
intiLengthLeft=iCurPos-iInLeft;
//Ifthecurrentpositionisgreaterthantheleftborder,generatetheleftchild
BT_InPostToTree(pbTree->
pbLChild,szInOrder,szPostOrder,iInLeft,iCurPos-1,iPostLeft,iPostLeft+iLengthLeft-1);
//Ifthecurrentpositionislessthantherightborder,generatetherightchild
pbRChild,szInOrder,szPostOrder,iCurPos+1,iInRight,iPostLeft+iLengthLeft,iPostRight-1);
returntrue;
intiMode=0;
请选择生成二叉树规则:
前序和中序(0),后序和中序
(1)\n"
%d"
iMode);
switch(iMode)
case0:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 二叉 平衡 判定