二叉排序树运算-数据结构与算法课程设计报告_l

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

合肥学院
计算机科学与技术系
课程设计报告
2009 ~2010 学年第二学期
课程
数据结构与算法
课程设计名称二叉排序树运算
学生姓名顾成方
学号03
专业班级08计科(2)指导教师王昆仑张贯虹
2010 年 5 月
题目:(二叉排序树运算问题)设计程序完成如下要求:对一组数据构造二叉排序树,并在二叉排序树中实现多种方式的查找。

基本任务:⑴选择合适的储存结构构造二叉排序树;⑵对二叉排序树T作中序遍历,输出结果;⑶在二叉排序树中实现多种方式的查找,并给出二叉排序树中插入和删除的操作。

⑷尽量给出“顺序和链式”两种不同结构下的操作,并比较。

一、问题分析和任务定义
本次程序需要完成如下要求:首先输入任一组数据,使之构造成二叉排序树,并对其作中序遍历,然后输出遍历后的数据序列;其次,该二叉排序树能实现对数据(即二叉排序树的结点)的查找、插入和删除等基本操作。

实现本程序需要解决以下几个问题:
1、如何构造二叉排序树。

2、如何通过中序遍历输出二叉排序树。

3、如何实现多种查找。

4、如何实现插入删除等操作。

二叉排序树的定义:
⑴其左子树非空,则左子树上所有结点的值均小于根结点的值。

⑵若其右子树非空,则右子树上所有结点的值大于根结点的值。

⑶其左右子树也分别为二叉排序树。

本问题的关键在于对于二叉排序树的构造。

根据上述二叉排序树二叉排序树的生成需要通过插入算法来实现:输入(插入)的第一个数据即为根结点;继续插入,当插入的新结点的关键值小于根结点的值时就作为左孩子,当插入的新结点的关键值大于根结点的值时就作为右孩子;在左右子树中插入方法与整个二叉排序树相同。

当二叉排序树建立完成后,要插入新的数据时,要先判断已建立的二叉排序树序列中是否已有当前插入数据。

因此,插入算法还要包括对数据的查找判断过程。

本问题的难点在于二叉排序树的删除算法的实现。

删除前,首先要进行查找,判断给出的结点是否已存在于二叉排序树之中;在删除时,为了保证删除结点后的二叉树仍为二叉排序树,要考虑各种情况,选择正确
的方法。

删除操作要分几种情况讨论,在后面有介绍。

二、概要设计和数据结构选择
用二叉链表作为二叉排序树的存储结构,其中key为结点关键值,*lchlid、
*rchild分别为左右孩子指针。

该程序的结构如下图所示:
三、详细设计和编码
首先定义二叉排序树的数据类型如下:typedef struct node
{
int
key;
45 24 53
12 28 90 45
24 53
12
28 90
45
2453
122890 1345
24
53
12
28
90
13
45
1353
12289045
13
53
12
28
90
红.数据结构与算法.北京:中国铁道出版社,
(2)王昆仑.李红.数据结构与算法试验指导,2009
(3)谭浩强.c程序设计.北京:清华大学出版社,
(4)严蔚敏.数据结构:c语言版.北京:清华大学出版社,2002
(5)耿国华.等.数据结构:用c语言描述.北京:高等教育出版社,2004
八、附录
#include ""
#include ""
#include ""
#define endflag 0叉排序树------查找┃┇\n");
printf("\t\t\t┇┃2.二叉排序树------插入┃┇\n");
printf("\t\t\t┇┃3.二叉排序树
------删除┃┇\n");
printf("\t\t\t┇┃4.二叉排序树
------显示┃┇\n");
printf("\t\t\t┇┃0.退出该程序
┃┇\n");
printf("\t\t\t┇┃
┃┇\n");
printf("\t\t\t┇┗┅┅┅┅┅┅┅┅┅┅┅┛┇\n");
printf("\t\t\t┗
**************************┛\n");
printf("\n\n\n");
do{
if(flag==0)
printf("!您的输入有误,请重新输入\n");
printf("请选择您要进行的项目:");
scanf("%d",&choice);
flag=0;
}while(choice<0||choice>4);
return choice;
}
法1-------递归查找┃┇\n");
printf("\t\t\t┇┃2.方法2-----非递归查找┃┇\n");
printf("\t\t\t┇┃
┃┇\n");
printf("\t\t\t┇┗┅┅┅┅┅┅┅┅┅┅┅┛┇\n");
printf("\t\t\t┗
**************************┛\n");
printf("\n\n\n");
do{
if(flag==0)
printf("!您的输入有误,请重新输入\n");
printf("请选择查找方法:");
scanf("%d",&choice);
flag=0;
}while(choice!=1&&choice!=2);
return choice;
}
//主函数
void main()
{
int i,j,k;
Bstnode *tree,*p;
system("cls");
printf(" ★☆★☆★请先建立一棵二叉排序树★☆★☆★\n\n");
printf("输入其结点信息(输入一组正整数,当输入0时结束):\n");
tree=CreateBST();
printf("中序遍历的二叉排序树:\n"); Inorder(tree);
printf("二叉排序树的根
为:%d\n",tree->key);
for(;;)
switch(i=mainmenu())
{
case 0:exit(0);
case 1:switch(j=searchmenu())
{
case
1:search_Bitree(tree);break;
case 2:printf("\n请输入要查找的结点的值:");
scanf("%d",&k);p=searchBST(tree,k);
printf("\n");
break;
//default:printf("输入有误!");
}
break;
case
2:tree=insert_Bitree(tree);break; case
3:tree=delete_Bitree(tree);break;
case 4:printf("\n");
printf("二叉排序树的根
为:%d\n",tree->key);
printf("中序遍历后的序列
为:\n");
print_Bitree(tree);
printf("中序遍历的二叉排序树:\n");
Inorder(tree);
printf("\n");
break;
//default:printf("输入有误!");
}
}。

相关文档
最新文档