二叉排序树的实现Word文档格式.docx
- 文档编号:22567608
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:24
- 大小:86.75KB
二叉排序树的实现Word文档格式.docx
《二叉排序树的实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《二叉排序树的实现Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
[1]李春葆尹为民李蓉蓉蒋晶鈺喻丹丹.数据结构教程上机实验指导.
[2]谭浩强.C程序设计教程
[3]唐宁九游洪跃朱宏.数据结构与算法(C++版)
工作计划:
共计一周时间,进度安排如下:
1.选题,在上机实验之前看透设计要求,翻阅资料完成程序设计大致提纲。
2.选好题,上级编写程序(需求分析、概要设计)。
3.填写算法,实现设计要求的各项功能(详细设计)。
4.调试和分析,最终完成较合理的程序设计。
5.按《数据结构课程设计大纲》中的要求完成课程设计报告格式。
任务下达日期:
2010年5月27日
任务完成日期:
2010年6月3日
指导教师(签名):
学生(签名):
(设计题目)
摘要:
设计一个程序,根据任一数列生成一棵二叉排序树;
实现基本的遍历方法;
查询结点并删除结点且保证仍为二叉排序树。
具体要求:
用顺序和二叉链表作存储结构,输入数列L,以回车('
)为输入结束标志生成一棵二叉排序树T;
对二叉排序树T作中序遍历,输出结果;
输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,否则输出信息“无x”。
根据二叉排序树的概念,查找当前插入的元素的位置;
删除结点如果不是叶子结点,要注意考虑如何使树仍为二叉排序树。
关键词:
二叉排序树,二叉链表,遍历,查询,删除
目录
1.设计背景4
1.1问题的提出4
1.2任务与分析4
2.设计方案4
2.1整体设计方案4
3.方案实施5
3.1主程序模块设计方案5
3.2初始化模块设计方案5
1).实现二叉树的初始化5
2).创建一棵二叉树:
6
3.3中序遍历模块设计方案:
7
3.4查找并删除元素模块设计方案8
1)查找元素x:
8
2)删除元素x:
3.5主函数设计方案10
4.结果与结论11
4.1结果演示11
4.2结果演示12
5.收获与致谢12
5.1总结:
12
5.2致谢:
13
6.参考文献13
7.附件13
7.1源程序:
1.设计背景
1.1问题的提出
根据自己的知识功底和能力水平,选择二叉排序树的实现问题。
而随着计算机发展并逐渐成为各行业不可缺少的东西,数据结构与算法包含计算机科学与技术的许多重要方面,对训练学生编出质量高、风格好的程序,又语言的发展,C++已成为用处最为广泛的语言。
该设计运用数据结构知识,利用C++编写,来锻炼和提高我自己的编程及独立解决问题的能力,故选较为基础,但知识点广泛的题目。
1.2任务与分析
任务是一个二叉排序树的实现问题,根据任一数列生成一棵二叉排序树;
根据二叉排序树的概念,查找当前插入的元素的位置;
2.设计方案
2.1整体设计方案
此课题研究二叉排序树的实现,建立二叉排序树;
中序遍历并显示遍历结果;
输入元素x,查找x;
若存在删除之,否则输出“无x”;
然后再进行中序遍历输出遍历结果。
为方便起见,画出流程图如图1:
图1
该程图描述了主要程序及函数。
3.方案实施
3.1主程序模块设计方案
#include<
iostream.h>
typedefintKeyType;
typedefcharElemType[10];
typedefstructtnode
{
KeyTypekey;
ElemTypedata;
structtnode*lchild,*rchild;
}BSTNode;
定义全局变量、分配储存空间。
3.2初始化模块设计方案
1).实现二叉树的初始化
BSTNode*CreatBST(KeyTypeA[],intn)
//由数组中的关键字建立一棵二叉排序树
{
BSTNode*bt=NULL;
//初始时bt为空树
inti=0;
while(i<
n)
if(InsertBST(bt,A[i]))//将A[i]插入二叉排序树T中
{
printf("
第%d步,插入%d:
"
i+1,A[i]);
DispBST(bt);
printf("
\n"
);
i++;
}
returnbt;
//返回建立的二叉排序树的根指针
}
intBSTInsert(BSTNode*&
bt,KeyTypek)
BSTNode*f,*p=bt;
while(p!
=NULL)
{
if(p->
key==k)
return(0);
f=p;
/*f指向*p结点的双亲结点*/
key>
k)
p=p->
lchild;
/*在左子树中查找*/
else
rchild;
/*在右子树中查找*/
}
p=newBSTNode;
/*建立新结点*/
p->
key=k;
lchild=p->
rchild=NULL;
if(bt==NULL)/*原树为空时,*p作为根结点插入*/
bt=p;
elseif(k<
f->
key)
f->
lchild=p;
/*插入*p作为*f的左孩子*/
else
rchild=p;
/*插入*p作为*f的右孩子*/
return
(1);
voidCreateBST(BSTNode*&
bt,KeyTypestr[],intn)
bt=NULL;
/*初始时bt为空树*/
while(i<
n)
{
BSTInsert(bt,str[i]);
/*将关键字str[i]插入二叉排序树bt中*/
i++;
voidinorder(BSTNode*t)//递归算法
if(t!
=0)
{
inorder(t->
lchild);
cout<
<
t->
key<
"
;
rchild);
}}
3.4查找并删除元素模块设计方案
BSTNode*BSTSearch(BSTNode*bt,KeyTypek)
BSTNode*p=bt;
=NULL&
&
key!
=k)
if(k<
p->
p=p->
/*沿左子树查找*/
/*沿右子树查找*/
return(p);
intBSTDelete(BSTNode*&
BSTNode*p=bt,*f,*r,*f1;
f=NULL;
/*p指向待比较的结点,f指向*p的双亲结点*/
=k)/*查找值域为x的结点*/
{f=p;
if(p->
k)
p=p->
/*在左子树中查找*/
/*在右子树中查找*/
if(p==NULL)/*未找到key域为k的结点*/
return(0);
elseif(p->
lchild==NULL)/**p为被删结点,若它无左子树*/
if(f==NULL)/**p是根结点,则用右孩子替换它*/
bt=p->
elseif(f->
lchild==p)/**p是双亲结点的左孩子,则用其右子替换它*/
{f->
deletep;
elseif(f->
rchild==p)/**p是双亲结点的右孩子,则用其右孩子替换它*/
rchild=p->
rchild==NULL)/**p为被删结点,若它无右子树*/
if(f==NULL)/**p是根结点,则用左孩子替换它*/
if(f->
lchild==p)/**p是双亲结点的左孩子,则用其左孩子替换它*/
rchild==p)/**p是双亲结点的右孩子,则用其左孩子替换它*/
else/**p为被删结点,若它有左子树和右子树*/
f1=p;
r=p->
/*查找*p的左子树中的最右下结点*r*/
while(r->
rchild!
=NULL)/**r一定是无右子树的结点,*f1作为r的双亲*/
{f1=r;
r=r->
if(f1->
lchild==r)/**r是*f1的左孩子,删除*r*/
f1->
lchild=r->
elseif(f1->
rchild==r)/**r是*f1的右孩子,删除*r*/
rchild=r->
r->
/*以下语句是用*r替代*p*/
if(f==NULL)/**f为根结点*/
bt=r;
/*被删结点是根结点*/
lchild==p)/**p是*f的左孩子*/
f->
lchild=r;
else/**p是*f的右孩子*/
rchild=r;
3.5主函数设计方案
voidmain()
intn;
BSTNode*bt=NULL,*p;
KeyTypea[200],k;
cout<
请输入元素个数n:
cin>
>
n;
请输入数据:
for(inti=0;
i<
i++)
cin>
a[i];
}
CreateBST(bt,a,n);
cout<
BST:
BSTdisp(bt);
cout<
endl;
中序遍历二叉排序树:
inorder(bt);
//cout<
先序遍历二叉排序树:
//preorder(bt);
输入要查找的元素x:
k;
p=BSTSearch(bt,k);
if(p!
BSTDelete(bt,k);
cout<
已经删除值为"
k<
的结点"
inorder(bt);
无"
4.结果与结论
4.1结果演示
(删除元素在二叉排序树中)
运行结果如图2:
4.2结果演示
(删除元素不在二叉排序树中)
运行结果如图3:
5.收获与致谢
这几天的工作,终于完成了程序设计。
可也遇到了不少问题,其中较为麻烦的是程序的调试。
经过这几天的的上机实践和查阅资料,我变改变思路用C++编写,最终实现了所有要求。
了虽然问题出现了不少,但收获也是颇丰:
认识到自己的不足,要努力。
解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
通过课程设计,提高了自己的编程能力。
掌握了以往不太熟悉的知识,比如:
C中的标准函数库、函数的调用及嵌套调用。
通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是数据结构,还有其它的计算机方面的知识都要重在实践,以后在学习过程中,我会更加注重实践操作能力的培养,无论学习什么,亲自动手去做了才能有最深刻的体会。
首先需要感谢的是指导老师兼数据结构老师冯慧玲老师,在她的督促下我们按时完成这个课程设计,并且对于提出的各种问题很热情耐心的解答。
没有她的教导自然就不可能有基础来完成课程设计了。
还有整个完成的过程中我们小组齐心合力,经过翻阅资料、编程,调试最终完成了此次课程设计,大家都得到了应有的收获。
6.参考文献
7.附件
voidBSTdisp(BSTNode*b);
/*BSTNode*CreatBST(KeyTypeA[],intn)
if(BSTInsert(bt,A[i]))//将A[i]插入二叉排序树T中
count<
第"
i+1<
步,插入:
A[i];
}*/
//先序遍历
/*voidpreorder(BSTNode*t)
preorder(t->
//中序遍历
voidinorder(BSTNode*t)
voidBSTdisp(BSTNode*bt)
if(bt!
bt->
key;
if(bt->
lchild!
=NULL||bt->
rchild!
cout<
("
BSTdisp(bt->
lchild);
if(bt->
cout<
"
rchild);
)"
cou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉排序树 实现