数据结构二叉排序树课程设计报告

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

课程设计报告

——数据结构

题目:二叉排序树

姓名:

学号:

专业:

班级:

指导老师:

年月日

目录

一、课程设计简介 (3)

二、原理分析及流程 (3)

2.1、原理分析 (3)

2.2、流程图 (4)

1、main()函数 (4)

2、创建 (4)

3、插入 (5)

4、查找 (6)

5、中序遍历输出 (7)

三、算法描述 (8)

3.1、存储结构 (8)

3.2、插入算法 (8)

3.3、查找算法 (9)

3.4、删除算法 (10)

四、小结与体会 (12)

五、程序执行过程 (13)

5.1、创建二叉排序树并中序输出 (13)

5.2、插入并中序输出 (13)

5.3、查找 (14)

六、程序清单 (14)

一、课程设计简介

1.1、题目:二叉排序树相关操作

1、创建二叉排序树;

2、插入给定值;

3、查找给定值;

4、删除给定值的结点。

1.2、报告要求:

1、封面;

2、题目与流程图或模块图;

3、程序清单和运行结果;

4、小结(收获和体会);

5、装订成册。

1.3、目的:

课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。

二、原理分析及流程

2.1、原理分析:

根据题目要求,要实现这些功能,就必须创建一个菜单。这个菜单设置在main()函数里面,然后使用

while()...switch()语句进行循环调用相关函数,以达到实现

相关功能的目的。

2.2、流程图:

1、main()函数:

2

3、插入:

4、查找:

5、中序遍历输出:

三、算法描述

3.1、存储结构

定义一个链表式的二叉排序树,用链表的方式构造结点,存储二叉排序树中的结点、结点类型和指针类型如下:

#include

#define null 0

typedef int keytype;

typedef struct node

{

keytype key;

struct node *lchild,*rchild;

}bstnode,*bstree;

3.2、插入算法

在二叉排序树中插入一个新节点,首先要查找该节点在二叉排序树中是否已经存在。若二叉排序树中不存在关键字等于x的节点,则插入。

将一个关键字值为x的节点s插入到二叉排序树中,可以用下面的方法:

(1)若二叉排序树为空,则关键字为x的节点s成为二叉排序树的根

(2)若二叉排序树非空,则将x与二叉排序树根进行比较,如果x的值等于根节点关键值,则停止插入;如果x的根节点值小于根节点关键值,则将x插入左子树;如果x的值大于根节点关键字的值,则将x插入右子树。在左右两个子树的插入方法与整个二叉排序树相同。

算法如下:

void insert(bstree *t,keytype x)

{

bstree s;

if(*t==null)

{

s=(bstree)malloc(sizeof(bstnode));

s->key=x;

s->lchild=null;

s->rchild=null;

*t=s;

}

else if(x<(*t)->key)

insert(&((*t)->lchild),x);

else if(x>(*t)->key)

insert(&((*t)->rchild),x);

}

3.3、查找算法

(1)若二叉排序树不为空,将根结点的关键字与待查关键字进行比较,若相等,则查找成功;若根节点关键字大于待查值,则进入左子树重复次步骤,否则,进入右子树进行此步骤;若在

查找过程中遇到二叉排序树的叶子节点时,还没有找到待查节点,则查找不成功。

(2)否则,查找失败,返回null。

算法如下:

bstree search(bstree t,keytype x)

{

bstree p;

p=t;

if(p!=null)

{

if (x==p->key) return p->key;

else if(xkey) return search(p->lchild,x);

else return search(p->rchild,x);

}

else

{ printf("%d can not be found\n",x);return null;

}

}

3.4、删除算法

在二叉排序树中删除节点,首先要确定被删除的节点是否在二叉排序树中。

若不在,则不做任何操作;否则,假设要删除的节点为p,节点p的父节点为r,并假设p是r的左孩子。根据被删除节点p 有无孩子,删除部分可做以下3中情况讨论:

(1)若p为叶子节点,则可令其父节点r的左孩子指针域为空,直接将其删除。

(2)若p节点只有右子树或左子树,则可以将p的左子树或右子树直接改为其双亲节点r的左子树。

(3)若p既有左子树又有右子树;将节点s为p的中序前驱。首先找到p的中序前驱节点s,然后用节点s的值代替节点p的值,再将节点s删除,节点s的原左子树改为s的双亲节点q 的右子树。

算法如下:

bstree delete(bstree t,keytype x)

{

bstree p,q,r,s;

p=t;

r=null;

while(p)

{

if(x==p->key) break;

r=p;

if(xkey) p=p->lchild;

相关文档
最新文档