第九组数据结课程设计二叉排序树实现Word格式文档下载.docx
- 文档编号:17580041
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:21
- 大小:162.10KB
第九组数据结课程设计二叉排序树实现Word格式文档下载.docx
《第九组数据结课程设计二叉排序树实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第九组数据结课程设计二叉排序树实现Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
1.通过bstreeCreatTree()操作建立二叉排序树。
2.在二叉排序树t中通过操作bstreeInsertBST(bstreet,int
key,nametypename,doublegrade)插入一个节点。
3.从二叉排序树t中通过操作voidDelete(bstree&
p)删除任意节点。
4.在二叉排序树t中通过操作bstnode*SearchBST(bstreet,keytypekey)查找节点。
5.在二叉排序树t中通过操作p=SearchBST(t,key)查询,并修改节点信息
6.非递归遍历二叉排序树。
7.定义函数voidcompare()对数组和二叉排序树的查找效率进行比较比较。
3.2创建二叉排序树CreatTree模块
从键盘中输入关键字及记录,并同时调用插入函数并不断进行插入。
最后,返回根节点T。
3.3删除模块:
二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。
假设二叉排序树上删除节点为*p(指向节点的指针为p),其双亲节点为*f(节点指针为f)。
若*p节点为叶子节点,则即左右均为空树,由于删去叶子节点不破坏整棵树的结构,则只需修改其双亲节点的指针即可;
若*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;
若*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)。
在二叉排序树中删除一个节点的算法为
voidDeleteData(bstree&
t,keytypekey)
若二叉排序树t中存在关键字等于key的数据元素,则删除该数据元素节点,并返回TRUE,否则返回FALSE。
3.4插入模块
二叉排序树是一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进行插入。
新插入的节点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个节点的左孩子或右孩子的节点。
一个无序系列可以通过构造一棵二叉排序树而变成一个有序系列,构造树的过程即为对无序系列进行排序的过程,并且每次插入的节点都是二叉排序树上新的叶子节点,则在进行插入操作时,不必移动其他节点,仅需改变某个节点的指针由空变为非空即可。
二叉排序树的插入算法为
bstreeInsertBST(bstreet,intkey,nametypename,doublegrade)
若二叉排序树中不存在关键字等于key的数据元素时,插入元素并返回TRUE。
3.5查找模块
二叉排序树又称二叉查找树,当二叉排序树不为空时,首先将给定的值和根节点的关键字比较,若相等则查找成功,否则将依据给定的值和根节点关键字之间的大小关系,分别在左子树或右子树上继续进行查找。
为此定义一个二叉排序树的查找算法为
bstnode*SearchBST(bstreet,keytypekey)
在根指针t所指向的二叉排序树中查找关键字等于key的数据元素,如成功,返回指向该元素节点的指针,否则返回空指针。
3.6二叉排序树的遍历
先序遍历也叫做先根遍历。
首先访问根结点然后遍历左子树,最后遍历右子树。
在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回。
其实过程为:
先遍历左子树root->
left->
left...->
null,由于是先序遍历,因此一遇到节点,便需要立即访问;
由于一直走到最左边后,需要逐步返回到父节点访问右节点,因此必须有一个措施能够对节点序列回溯。
其一可以用栈记忆在访问途中将依次遇到的节点保存下来。
根据栈的先进后出、后进先出的特点特点。
则可以用栈保存。
每次都将遇到的节点压入栈,当左子树遍历完毕后从栈中弹出最后一个访问的节点,然后访问其右子树。
基本算法思想:
1.先访问根节点,将根节点入栈
2.重复执行两大步骤:
如果该节点左孩子存在,则访问该左孩子节点,并将其指针入栈。
重复以上操作,直到节点的左孩子不存在。
将栈顶的元素,即其指针出栈,回到父节点,如果该指针节点的右孩子存在,则将该指针指向的右孩子节点重复执行以上步骤,直到桟为空为止。
操作函数为voidx_print(TreeT)
中序遍历:
中序遍历和先序遍历访问的顺序不同。
中序遍历访问顺序为中序遍历左子数,在访问根节点,最后中序遍历右子树。
先序遍历是先访问,再入栈;
而中序遍历则是先入栈,弹栈后再访问。
将二叉树的根节点入栈,如果该节点有左孩子,将左孩子直接入栈,重复该操作,直到该节点无左孩子;
在将栈顶元素出栈,并访问该节点指向的节点,如果该指针指向的右孩子存在,则将当前指针指向右孩子节点。
重复执行步骤直到栈为空为止。
操作函数为voidz_print(TreeT)。
后序遍历:
先后序遍历左子树,在后序遍历右子树,最后访问根节点。
先将根节点入栈,如果该节点左孩子节点存在,将该节点左孩子节点入栈。
重复执行此操作,直到节点左孩子节点为空。
取栈顶元素,并赋值给P,如果P的右孩子为空或P的右孩子等于q(即如果p的右孩子已访问,则访问根节点,即p指向的节点,并用q来记录刚刚访问的节点的指针),若p有右孩子,且右孩子没有别访问过,则p=p->
rchild。
操作函数为voidh_print(TreeT)
4.源代码
#include<
iostream>
/*runthisprogramusingtheconsolepauseroraddyourowngetch,system("
pause"
)orinputloop*/
#include<
stdio.h>
string>
time.h>
iomanip>
usingnamespacestd;
typedefstringnametype;
typedefunsignedlongkeytype;
typedefstructnode//结点的结构体
{
keytypekey;
nametypename;
intgrade;
structnode*lchild,*rchild;
}bstnode;
typedefbstnode*bstree;
//栈的定义//
typedefstruct{
bstree*base;
bstree*top;
intstacksize;
}Sqstack;
intInitStack(Sqstack&
s)
//s.base=(bstree*)malloc(1000*sizeof(int));
s.top=s.base;
return1;
};
intPush(Sqstack&
s,node*e)
*s.top=e;
s.top=s.top+1;
intPop(Sqstack&
s,bstree&
e)
if(s.top==s.base)return0;
elses.top=s.top-1;
e=*s.top;
//非递归历遍并输出结点信息//
/*---------------先序非递归遍历---------------*/
voidx_print(node*t)
Sqstacks;
InitStack(s);
bstnode*p;
p=t;
while(p||!
(s.top==s.base))
{
if(p)
{
Push(s,p);
cout<
<
p->
key<
"
\t"
setw(20);
name<
grade<
endl;
p=p->
lchild;
}
else
{
Pop(s,p);
rchild;
}
}
/*---------------中序非递归遍历---------------*/
voidz_print(node*t)
/*---------------非递归后序遍历---------------*/
voidh_print(node*t)
InitStack(s);
node*p,*q;
q=NULL;
while(p||!
if(p){
p=p->
}else
p=*(s.top-1);
if(p->
rchild==q)
{
Pop(s,q);
p=NULL;
cout<
q->
cout<
q=NULL;
}
//递归查找二叉树//
/*---归查找,若找到就返回指向该结点的指针,否则返回空---*/
bstnode*SearchBST(bstreet,keytypekey){
if(t==NULL||key==t->
key)
returnt;
if(key<
t->
returnSearchBST(t->
lchild,key);
else
rchild,key);
//-------------------给定学生信息插入到二叉树中-------------------//
bstreep,q;
if(t==NULL)
t=newbstnode();
t->
key=key;
name=name;
grade=grade;
lchild=t->
rchild=NULL;
p=t;
while(p){
q=p;
if(p->
key>
p=q->
elseif(p->
else
树中已有该节点:
returnt;
}
p=newbstnode();
p->
lchild=p->
if(q->
q->
lchild=p;
rchild=p;
returnt;
//-------------------二叉树排序树的构建-------------------//
bstreeCreatTree()
bstreet=NULL;
doublegrade;
printf("
\n*****本系统由二胡科技所有成员公同组建!
*****\n\n\n"
);
请输入---学号---姓名---成绩---(输入0时结束):
\n"
cin>
>
key;
if(key==0)
name;
grade;
while(key)
t=InsertBST(t,key,name,grade);
if(key==0)
break;
cin>
//-------------------删除树中的结点-------------------//
voidDelete(bstree&
p)
bstreeq,s;
if(!
rchild)
q=p;
p=q->
lchild;
deleteq;
elseif(!
lchild)
p=p->
s=p->
while(s->
q=s;
s=s->
name=s->
if(q!
=p)
rchild=s->
lchild=s->
deletes;
t){
printf("
没有该信息,请重新输入!
DeleteData(t,key);
if(t->
key==key)
Delete(t);
printf("
删除成功!
elseif(t->
DeleteData(t->
lchild,key);
rchild,key);
//二叉树的深度
intTreeDepth(bstreet)
intleft,right,max;
if(t!
=NULL)
left=TreeDepth(t->
lchild);
right=TreeDepth(t->
rchild);
max=left>
right?
left:
right;
returnmax+1;
}else
return0;
//树状输出二叉树
voidPrintTree(bstreet,intlayer)
intk;
if(t==NULL)
return;
PrintTree(t->
rchild,layer+1);
for(k=0;
k<
layer;
k++)
cout<
"
;
cout<
lchild,layer+1);
//-------------------主函数测试-------------------//
intmain()
intd;
//system("
cls"
system("
Color2f"
keytypekey;
t=CreatTree();
d=TreeDepth(t);
二叉排序树的树形表示如下\n"
PrintTree(t,d);
charchoose;
bstreep;
printf("
\n"
-----------------------------请输入你要选择的操作-------------------------------\n"
|-------------------------------------|\n"
||-----------------------------------||\n"
||a插入信息||\n"
||b删除信息||\n"
||c查询信息||\n"
||d修改信息||\n"
||0退出||\n"
||e对二叉排序树进行非递归遍历||\n"
需要选择的操作为:
choose;
while(choose)
switch(choose)
{
case'
a'
:
输入需要插入的学生信息信息(学号为0时结束).\n"
cin>
if(key==0){
PrintTree(t,d);
printf("
\n*****插入信息结束!
break;
while(key)
t=InsertBST(t,key,name,grade);
cin>
if(key==0)
printf("
插入信息结束!
break;
b'
请输入要删除信息学生的学号:
DeleteData(t,key);
d=TreeDepth(t);
删除结点后二叉树的树形显示如下\n"
c'
请输入要查询学生的学号:
p=SearchBST(t,key);
if(p==NULL)
无查询的关键字:
成绩"
setw(20)<
姓名"
学号"
d'
请输入要修改学生的学号:
无你所要修改的关键字:
\n请输入修改的姓名:
\n请输入修改的成绩:
p->
\n修改成功!
e'
if(!
t)
没有任何信息,请先输入信息!
------------------非递归先序遍历----------------\n"
x_print(t);
------------------非递归中序遍历-----------------\n"
)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第九 数据 课程设计 二叉排序树 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)