数据结构二叉树的算法.docx
《数据结构二叉树的算法.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树的算法.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构二叉树的算法
数据结构课程设计报告
二叉树算法
计算机科学与技术学院
计算机网络1102班
学号:
1108040212
张花
二叉树算法
一.课程设计目的与要求:
1.掌握二叉树的基本概念和性质
2.掌握创建和构造二叉树的算法
3.掌握二叉树存储基本的三种递归算法
4.掌握计算二叉树的结点
实验要求:
(1)理解二叉树的初始化二叉树空的判断;
(2)理解二叉树的遍历算法,掌握其基本应用。
二.实验原理及内容
实验题目:
1.创建二叉树的链表结构;
2.实现二叉树链表的初始化算法,二叉树空的判断算法;
3.实现二叉树的先序遍历算法,中序遍历算法和后序遍历算法;
4.利用某遍历算法实现计算二叉树中的叶子结点;
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);
Prorder1(bt->right,visit);
}}
中序遍历算法
voidProrder2(BiTNode*bt,void(*visit)(TElemType))/
{BiTNode*p,*stack[MAS];
inttop;
top=0;p=bt;
while(top!
=0||p!
=NULL)
{while(p!
=NULL)
{stack[top]=p;top++;
p=p->left;
}
if(top!
=0)
{p=stack[top-1];
top--;
visit(p->data);
p=p->right;
}
}
}
后序遍历算法
voidProrder3(BiTNode*bt,void(*visit)(TElemType))/
{BiTNode*p,*stack[MAS];
inttop;
top=0;
stack[top]=bt;top++;
while(top>0)
{p=stack[top-1];top--;
while(p!
=NULL)
{visit(p->data);
stack[top]=p->right;
top++;
p=p->left;
}
}
}
等一系列的代码说明就不再报告中啰说还占用报告篇幅
4.程序结果截图
五.课程设计小结
1.指出二叉树的顺序存储和链式存储的优缺点:
(顺序存储可能会浪费空间,但是读取某个指定节点的时候效率比较高)
2.将你测试使用的二叉树,如果使用顺序存储,请画出存储结构
3.课程设计的时间好短啊,好难的课程设计啊!
!
!
!
!
!
!
!
!
!
!
!
!
附件:
#include
#include
#defineMAX50
#defineMAS20
#defineCHAR1
#ifCHAR
typedefcharTElemType;
TElemTypeNil='';
#defineform"%c"
#else
typedefintTElemType;
TElemTypeNil=0;
#defineform"%d"
#endif
typedefstructnode
{TElemTypedata;
structnode*left;
structnode*right;
structnode*parent;
}BiTNode,*BiTree;
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;bt->parent=NULL;
bt->left=CreateBiTree(bt->left);
if(bt->left)bt->left->parent=bt;
bt->right=CreateBiTree(bt->right);
if(bt->right)bt->right->parent=bt;
}
returnbt;
}
voidPrintTree(BiTNode*bt,inti)
{if(bt!
=NULL)
{PrintTree(bt->right,i+5);
#ifCHAR
if(bt->data!
=Nil)
printf("%*c\n",i,bt->data);
#else
if(bt->data!
=Nil)
printf("%*d\n",i,bt->data);
#endif
PrintTree(bt->left,i+5);
i=i-5;
}
}
voidProrder1(BiTNode*bt,void(*visit)(TElemType))/*先序遍历*/
{if(bt!
=NULL)
{visit(bt->data);
Prorder1(bt->left,visit);
Prorder1(bt->right,visit);
}
}
voidProrder2(BiTNode*bt,void(*visit)(TElemType))/*中序遍历*/
{BiTNode*p,*stack[MAS];
inttop;
top=0;p=bt;
while(top!
=0||p!
=NULL)
{while(p!
=NULL)
{stack[top]=p;top++;
p=p->left;
}
if(top!
=0)
{p=stack[top-1];
top--;
visit(p->data);
p=p->right;
}
}
}
voidProrder3(BiTNode*bt,void(*visit)(TElemType))/*后序遍历*/
{BiTNode*p,*stack[MAS];
inttop;
top=0;
stack[top]=bt;top++;
while(top>0)
{p=stack[top-1];top--;
while(p!
=NULL)
{visit(p->data);
stack[top]=p->right;
top++;
p=p->left;
}
}
}
voidvisit(TElemTypee)
{printf(form"",e);
}
intSumLefts(BiTNode*bt,intsum)
{
if(bt!
=NULL)
{
if(bt->left==NULL&&bt->right==NULL)
{
printf("%4c",bt->data);sum++;
}
sum=SumLefts(bt->left,sum);
sum=SumLefts(bt->right,sum);
}
return(sum);
}
intSumTree(BiTNode*bt)
{staticintsum=0;
if(bt!
=NULL)
{printf("%4c",bt->data);
sum++;
sum=SumTree(bt->left);
sum=SumTree(bt->right);
}
return(sum);
}
BiTNode*Findchar(BiTNode*bt,charch)/*二叉树查找结点*/
{BiTNode*p;/*利用函数名返回结果*/
if(bt!
=NULL)
{if(bt->data==ch)p=bt;
p=Findchar(bt->left,ch);
p=Findchar(bt->right,ch);
}
if(p!
=NULL)return(p);
elsereturn(NULL);
}
voidmain()
{intj,i,a,sum=0;
BiTreebt;
bt=InitBiTree(bt);
#ifCHAR
printf("请先序输入二叉树(如:
ab三个空格表示a为根结点,b为左子树的二叉树)\n");
#else
printf("请先序输入二叉树(如:
12000表示1为根结点,2为左子树的二叉树)\n");
#endif
bt=CreateBiTree(bt);
printf("输入建立的二叉树!
!
!
\n");
PrintTree(bt,5);
do{
printf("------------------------------------------------------------");
printf("\n主菜单");
printf("\n1二叉树先序遍历");
printf("\n2二叉树后序遍历");
printf("\n3二叉树中序遍历");
printf("\n4二叉树叶子结点数");
printf("\n5二叉树结点数");
printf("\n6二叉树查找x结点");
printf("\n0退出");
printf("\n----------------------------------------------------------");
printf("\n");
printf("输入你要选择的数据:
");
scanf("%d",&i);
switch(i)
{case1:
printf("先序遍历结果为:
");
Prorder1(bt,visit);
break;
case2:
printf("后序遍历结果为:
");
Prorder2(bt,visit);
break;
case3:
printf("中序遍历结果为:
");
Prorder3(bt,visit);
break;
case4:
j=SumLefts(bt,sum);
printf("树的叶子结点数为%d:
",j);
break;
case5:
j=SumTree(bt);
printf("树的结点数为%d:
",j);
break;
case6:
printf("输入要查找的结点字符x:
");
scanf("%c",&a);scanf("%*c");
//j=Findchar(bt,a);
printf("要查找的结点的指针为%d:
",j);
break;
case0:
exit(0);
}
printf("\n");
//getch();
}while(i>0||i<8);
}