二叉排序树运算-数据结构与算法课程设计报告_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");

相关文档
最新文档