数据结构二叉树的算法Word下载.docx
《数据结构二叉树的算法Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树的算法Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
![数据结构二叉树的算法Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/30/de591c01-23e4-4ffe-88d5-a7cb3f4ed717/de591c01-23e4-4ffe-88d5-a7cb3f4ed7171.gif)
5.求二叉树中的结点数;
6.设计一个算法,求二叉树指定的结点x的层数,求先序遍历序列中第k个结点的左孩子;
三.课程设计内容解答:
1.二叉树的二叉链式存储结构的结点结构体定义
typedefstructnode
{TElemTypedata;
structnode*left;
structnode*right;
structnode*parent;
}BiTNode,*BiTree;
2.写二叉树的先序,中序,后序遍历算法
先序遍历算法
voidProrder1(BiTNode*bt,void(*visit)(TElemType))
{if(bt!
=NULL)
{visit(bt->
data);
Prorder1(bt->
left,visit);
right,visit);
}}
中序遍历算法
voidProrder2(BiTNode*bt,void(*visit)(TElemType))/
{BiTNode*p,*stack[MAS];
inttop;
top=0;
p=bt;
while(top!
=0||p!
{while(p!
{stack[top]=p;
top++;
p=p->
left;
}
if(top!
=0)
{p=stack[top-1];
top--;
visit(p->
right;
}
后序遍历算法
voidProrder3(BiTNode*bt,void(*visit)(TElemType))/
stack[top]=bt;
while(top>
0)
while(p!
{visit(p->
stack[top]=p->
等一系列的代码说明就不再报告中啰说还占用报告篇幅
4.程序结果截图
五.课程设计小结
1.指出二叉树的顺序存储和链式存储的优缺点:
(顺序存储可能会浪费空间,但是读取某个指定节点的时候效率比较高)
2.将你测试使用的二叉树,如果使用顺序存储,请画出存储结构
3.课程设计的时间好短啊,好难的课程设计啊!
!
附件:
#include<
stdlib.h>
stdio.h>
#defineMAX50
#defineMAS20
#defineCHAR1
#ifCHAR
typedefcharTElemType;
TElemTypeNil='
'
;
#defineform"
%c"
#else
typedefintTElemType;
TElemTypeNil=0;
%d"
#endif
typedefstructnode
BiTNode*InitBiTree(BiTNode*bt)
{
bt=NULL;
returnbt;
BiTNode*CreateBiTree(BiTNode*bt)
{TElemTypech;
scanf(form,&
ch);
if(ch==Nil)bt=NULL;
else
{bt=(BiTNode*)malloc(sizeof(BiTNode));
if(!
bt)exit(0);
bt->
data=ch;
parent=NULL;
left=CreateBiTree(bt->
left);
if(bt->
left)bt->
left->
parent=bt;
right=CreateBiTree(bt->
right);
right)bt->
right->
voidPrintTree(BiTNode*bt,inti)
{if(bt!
{PrintTree(bt->
right,i+5);
#ifCHAR
data!
=Nil)
printf("
%*c\n"
i,bt->
#else
%*d\n"
#endif
PrintTree(bt->
left,i+5);
i=i-5;
voidProrder1(BiTNode*bt,void(*visit)(TElemType))/*先序遍历*/
voidProrder2(BiTNode*bt,void(*visit)(TElemType))/*中序遍历*/
voidProrder3(BiTNode*bt,void(*visit)(TElemType))/*后序遍历*/
voidvisit(TElemTypee)
{printf(form"
"
e);
intSumLefts(BiTNode*bt,intsum)
if(bt!
{
if(bt->
left==NULL&
&
right==NULL)
%4c"
bt->
sum++;
sum=SumLefts(bt->
left,sum);
right,sum);
return(sum);
intSumTree(BiTNode*bt)
{staticintsum=0;
if(bt!
{printf("
sum=SumTree(bt->
BiTNode*Findchar(BiTNode*bt,charch)/*二叉树查找结点*/
{BiTNode*p;
/*利用函数名返回结果*/
{if(bt->
data==ch)p=bt;
p=Findchar(bt->
left,ch);
right,ch);
if(p!
=NULL)return(p);
elsereturn(NULL);
voidmain()
{intj,i,a,sum=0;
BiTreebt;
bt=InitBiTree(bt);
请先序输入二叉树(如:
ab三个空格表示a为根结点,b为左子树的二叉树)\n"
);
12000表示1为根结点,2为左子树的二叉树)\n"
bt=CreateBiTree(bt);
输入建立的二叉树!
!
\n"
PrintTree(bt,5);
do{
------------------------------------------------------------"
\n主菜单"
\n1二叉树先序遍历"
\n2二叉树后序遍历"
\n3二叉树中序遍历"
\n4二叉树叶子结点数"
\n5二叉树结点数"
\n6二叉树查找x结点"
\n0退出"
\n----------------------------------------------------------"
输入你要选择的数据:
"
scanf("
&
i);
switch(i)
{case1:
先序遍历结果为:
Prorder1(bt,visit);
break;
case2:
后序遍历结果为:
Prorder2(bt,visit);
case3:
中序遍历结果为:
Prorder3(bt,visit);
case4:
j=SumLefts(bt,sum);
树的叶子结点数为%d:
j);
case5:
j=SumTree(bt);
树的结点数为%d:
case6:
输入要查找的结点字符x:
a);
%*c"
//j=Findchar(bt,a);
要查找的结点的指针为%d:
case0:
exit(0);
printf("
//getch();
}while(i>
0||i<
8);