数据结构二叉排序树.doc

上传人:laozhun 文档编号:2396638 上传时间:2023-02-17 格式:DOC 页数:18 大小:112.50KB
返回 下载 相关 举报
数据结构二叉排序树.doc_第1页
第1页 / 共18页
数据结构二叉排序树.doc_第2页
第2页 / 共18页
数据结构二叉排序树.doc_第3页
第3页 / 共18页
数据结构二叉排序树.doc_第4页
第4页 / 共18页
数据结构二叉排序树.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《数据结构二叉排序树.doc》由会员分享,可在线阅读,更多相关《数据结构二叉排序树.doc(18页珍藏版)》请在三一办公上搜索。

1、二叉排序树操作一、 设计步骤1) 分析课程设计题目的要求2) 写出详细设计说明3) 编写程序代码,调试程序使其能正确运行4) 设计完成的软件要便于操作和使用5) 设计完成后提交课程设计报告(一)程序功能:1)创建二叉排序树2)输出二叉排序树3)在二叉排序树中插入新结点4)在二叉排序树中删除给定的值5)在二叉排序树中查找所给定的值(二)函数功能:1) struct BiTnode 定义二叉链表结点类型包含结点的信息2) class BT 二叉排序树类,以实现二叉排序树的相关操作3) InitBitree() 构造函数,使根节点指向空4) BT () 析构函数,释放结点空间5) void Inse

2、rtBST(&t,key) 实现二叉排序树的插入功能6) int SearchBST(t,key) 实现二叉排序树的查找功能7) int DelBST(&t,key) 实现二叉排序树的删除功能8) void InorderBiTree (t) 实现二叉排序树的排序(输出功能)9) int main() 主函数,用来完成对二叉排序树类中各个函数的测试二、 设计理论分析方法(一) 二叉排序树定义 首先,我们应该明确所谓二叉排序树是指满足下列条件的二叉树:(1)左子树上的所有结点值均小于根结点值;(2)右子数上的所有结点值均不小于根结点值;(3)左、右子数也满足上述两个条件。根据对上述的理解和分析,

3、我们就可以先创建出一个二叉链表结点的结构体类型(struct BiTNode)和一个二叉排序树类(class BT),以及类中的构造函数、析构函数和其他实现相关功能的函数。(二) 插入函数(void InsertBST(&t,key))首先定义一个与BiTNode *BT同一类型的结点p, 并为其申请空间,使p-data=key,p-lchild和p-rchild=NULL。然后通过对int SearchBST(t,key)的返回值,来判断插入的结点是否已存在,若不存在则从根节点开始,按照二叉排序树的定义来寻找存放新结点的位置,已实现插入操作。(三) 查找函数(int SearchBST(t,

4、key))同样,根据二叉排序树的定义,若所查找的数小于当前结点,则使当前结点等于该结点所指向的左孩子。反之,指向其右孩子。直到找到与所查找的数值相等时,输出该值;或当查找到的结点已经指向空时,则说明该二叉排序树中没有所查找的值。(四) 删除函数(int DelBST(&t,key))首先要找到被删除元素所在的结点p与他的父结点f。然后分一下3种情况进行处理:(1)p为叶子结点,此时直接删除该结点,再修改其父结点的指针。(2)p只存在一个孩子,若p是f的左孩子,则将p的单支子树链接到f的左指针上;否则将p的单支子树链接到f的右指针上。(3)p的左子树与右子树均不空。此时,若p的左孩子的右子树为空

5、,则将p的左孩子赋值给p,左孩子的左子树链接到结点p的左指针上;否则,从结点p的左孩子开始沿右链进行搜索,直到发现某结点s的右指针空为止,将结点s的值赋给结点p,将结点s的左子树链接到s父结点的右指针上。若在二叉排序树中找不到这个元素,则重新返回到选择删除这一步。(五) 输出函数(void InorderBiTree (t))即中序遍历,因为通过中序遍历我们可以是二叉排序树得到一个有序的序列。其实现方法是从根结点开始,通过调用函数InorderBiTree (t)并在此函数中的递归调用来实现中序遍历。三、 设计结论及其分析(一) 输入正确数据时输出结果与分析:1.输出结果:2.分析:程序开始对

6、二叉排序树进行初始化并将二叉排序树的头结点置为空;接着逐个输入你所想建立此二叉排序树结点的关键字的值,然后中序遍历之并输出其序列;输入你想插入的关键字的值,同样继续中序遍历之并输出其插入数据后的序列;输入已存在的数据中你想删除的关键字的值,输入前确定你所输入的关键字的值存在于此二叉排序树中,继续中序遍历之且输出删除数据后的序列;输入已存在数据中你想查找的关键字的值,输出查找到该节点,并输出查找到的结点的值。这是一套符合常理的数据输入输出结果。(二)输入非正确数据时输出结果与分析:1.输出结果:2.分析:程序开始对二叉排序树进行初始化并将二叉排序树的头结点置为空;接着逐个输入你所想建立此二叉排序

7、树结点的关键字的值,然后中序遍历之并输出其序列;输入你想插入的关键字的值,同样继续中序遍历之并输出其插入数据后的序列;输入你想删除的关键字的值,若你输入的值不存在于此二叉排序树中,返回没有你要删除的信息,继续输入你要删除的关键字的值,直到你输入的关键字的值在二叉排序树中能找到时,中序遍历之且输出删除数据后的序列;输入你想查找的关键字的值,若输入的数据不存在于此二叉排序树,返回没有查找到该结点的信息。 四、 课程设计感想通过这次的课程设计,让我收获很大,使我较为深刻的了解了二叉排序树的基本功能和操作。一开始我的程序使用C语言写的,整个过程相对来讲进行的比较顺利,并没有遇到太大的困难。后来可能是因

8、为上学期没有C+的课程设计,没有对C+语言的知识点做整体的考虑,所以导致了在用C+语言来写时,无形中遇到了很多的困难。后来在经过查询资料,又对C+做了一个大致的复习。终于在同学及老师的帮助下完成了这个C+版本的二叉排序树相关操作的程序。课程设计即将结束,然而在这些天里所收获的知识却对自己造成了可观的价值。使自己在程序设计方面的能力有了进一步的提高。我很喜欢这样的课程设计,因为我们在设计的过程中不仅可以将所学知识做一个系统的整合,还能提升自己的能力,所以,我很珍惜这次的课程设计,更加期待我们专业今后其他课程的课程设计!附录#includeusing namespace std;class BTp

9、ublic :BT(void)/构造函数void InitBiTree(BiTree *t);coutlchild);coutkeyrchild); /查找数据BiTree SearchBST(BiTree t, int k) BiTree p;p=t;while(p!=NULL)&(p-key!=k)if(kkey) p=p-lchild;else p=p-rchild;return(p);/插入数据void InsertBST(BiTree *t,int k)BiTnode *f,*p=*t;while(p)if(p-key=k) return;f=p;p=(kkey)?p-lchild:

10、p-rchild; p=(BiTree)malloc(sizeof(BiTnode);p-key=k;p-lchild=p-rchild=NULL;if(*t=NULL) *t=p;else if (kkey)f-lchild=p;else f-rchild=p;/在二叉排序树*t中删除关键字为k的结点int DelBST(BiTree *t,int k)BiTree p,f,q,s,root;root=*t;p=*t; f=NULL;while(p)if(p-key=k)break; /找到关键字为k的结点f=p;p=(kkey)?p-lchild:p-rchild; / 分别在*p的左、右

11、子树中查找if(!p)cout没有你要删除的数据lchild=NULL&p-rchild=NULL)if(p=*t) *t=NULL;else if(p=f-lchild) f-lchild=NULL;else f-rchild=NULL;free(p);elseif(p-lchild=NULL&p-rchild!=NULL) / *p无左子树 if(f-lchild=p)f-lchild=p-rchild; /将*p的右子树链接到其父结点的左链上elsef-rchild=p-rchild; /将*p的右子树链接到其父结点的右链上free(p);else if(p-rchild=NULL&p-

12、lchild!=NULL) /*p有左子树if (f-lchild=p) /用*p的左子树代替*pf-lchild=p-lchild;elsef-rchild=p-lchild;free(p);else if(p-lchild!=NULL&p-rchild!=NULL)q=p;s=p-lchild;while(s-rchild)q=s;s=s-rchild; p-key=s-key; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; free(s); BT()cout调用析构函数释放!endl;/ 析构private:;/class BTi

13、nt main()BT bt;/class BT创建对象btBT:BiTree t=NULL,p;int key,q=1;bt.InitBiTree(&t);cout请输入关键字的值,以0结束:key; while(key)bt.InsertBST(&t,key); cinkey; cout中序遍历建立的二叉排序树的序列为:; bt.InorderBiTree(t); coutendl; cout请输入要插入的结点的关键字的值:key; bt.InsertBST(&t,key); cout插入后的二叉排序树的中序序列为:endl; bt.InorderBiTree(t); coutendl;f

14、or(q=1;)cout请输入要删除的结点的关键字的值:key;q=bt.DelBST(&t,key);if(q!=0)break; cout删除后的二叉排序树的中序序列为:endl;bt.InorderBiTree(t);coutendl; cout请输入要查找的结点的关键字的值:key; p=bt.SearchBST(t,key); if(p=NULL) cout没有查找到该结点endl; else cout查找到该结点:;coutkeyendl; return 0;参考文献1.数据结构 (C语言版)严蔚敏、吴伟民 主编 清华大学出版社 2.实用数据结构:C+描述徐士良, 葛兵 编著 清华大学出版社3.C+程序设计谭浩强 编著 清华大学出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号