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