二叉排序树的建立插入删除和查找Word文件下载.docx
- 文档编号:22211816
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:10
- 大小:17.55KB
二叉排序树的建立插入删除和查找Word文件下载.docx
《二叉排序树的建立插入删除和查找Word文件下载.docx》由会员分享,可在线阅读,更多相关《二叉排序树的建立插入删除和查找Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
8;
二、概要设计
1、程序的主要流程图:
否
是
开场
建树:
①依次输入n个关键字
②插入二叉排序树中
③中序输出创立过程
删除任意结点
插入一个结点
查找关键字
中序输出操作后二叉排序树
是否继续
完毕
2、主要模块:
1〕主函数模块
Main()
{
建立n个关键字的二叉排序树并输出;
从二叉树排序树T中删除任意结点,其关键字为x;
在二叉树排序树T中,插入一个结点t,其关键字为key1;
在二叉排序树T中递归查找关键字等于key2的数据元素;
查找成功那么输出SUCCESS;
查找失败那么输出NOSUCCESS;
}
2〕创立二叉排序树模块
BiTreeCreatBST(intn)
建立n个关键字的二叉排序树;
从键盘输入调建立n个关键字依次用InsertBST1〔插入函数〕;
返回根结点T;
输出过程;
3〕删除模块
DeleteNode(BiTree&
T,intx)
可以实现删除根结点、叶子结点以及其它任意结点的功能;
4〕插入模块
voidInsertBST1(BiTree&
T,BiTNode*s)
在二叉树排序树T中,插入一个结点s(递归算法);
被CreatBST函数调用;
5〕查找模块
BiTreeSearchBST1(BiTreeT,TElemTypekey)
在根指针T所指二叉排序树中递归查找关键字等于key的数据元素;
假设成功,返回指向该数据元素结点的指针;
否那么返回空指针;
3、抽象数据类型设计;
对于二叉树排序树而言,每个节点都是由“数据域〞、左右“指针域〞三局部组成的,因此将二叉树抽象成一个指向根结点由“关键字,左右孩子〞构成的二叉链表。
三、详细设计
1、二叉排序树数据类型定义;
typedefstructBiTNode
TElemTypedata;
structBiTNode*lchild,*rchild;
//左右孩子指针
}BiTNode,*BiTree;
BiTreeT;
//二叉树排序树T
2、主要函数说明:
〔伪代码及算法设计思想〕
voidmain()
T=CreatBST(n);
//建立n个关键字的二叉排序树,返回根结点T
//从二叉树排序树T中删除任意结点,其关键字为x
DeleteNode(T,x);
Inorder(T);
//在二叉树排序树T中,插入一个结点t,其关键字为key1
t=(BiTree)malloc(sizeof(BiTNode));
t->
data=key1;
lchild=NULL;
t->
rchild=NULL;
InsertBST1(T,t);
//在二叉排序树T中递归查找关键字等于key2的数据元素
s=SearchBST1(T,key2);
if(s)printf("
SUCESS\n"
);
//查找成功
elseprintf("
NOSUCESS\n"
//查找失败
BiTreeSearchBST1(BiTreeT,TElemTypekey)
{//在根指针T所指二叉排序树中递归查找关键字等于key的数据元素
//假设成功,返回指向该数据元素结点的指针,否那么返回空指针;
s为返回//指针
if(T==NULL)returnNULL;
if(T->
data==key)s=T;
elseif(T->
data>
key)//key大于当前结点的关键字,那么查找左子树
s=SearchBST1(T->
lchild,key);
//key小于当前结点的关键字那么查找右子树
Else
s=SearchBST1(T->
rchild,key);
returns;
voidInorder(BiTreeT)
{//中序输出二叉树排序树T(非空时)
if(T!
=NULL)
{
Inorder(T->
lchild);
//中序输出左子树
printf("
%3d"
T->
data);
//访问结点
rchild);
//中序输出右子树
}
{//在二叉树排序树T中,插入一个结点s的递归算法
t=SearchBST1(T,s->
//假设s的关键字不在T中出现,那么插入
if(!
t)
if(T==NULL)T=s;
//空树时作为根结点
elseif(s->
data<
T->
data)
InsertBST1(T->
lchild,s);
//将s插入T的左子树
else
InsertBST1(T->
rchild,s);
//将s插入T的右子树
{//建立n个关键字的二叉排序树,
//从键盘输入调建立n个关键字依次用InsertBST1〔插入函数〕,
//返回根结点T
T=NULL;
printf("
建树过程:
\n"
for(i=1;
i<
=n;
i++)
{
插入结点关键值:
scanf(key);
s=(BiTree)malloc(sizeof(BiTNode));
//开辟存储单元,并对结点赋值
s->
data=key;
s->
InsertBST1(T,s);
//调用插入算法
Inorder(T);
//中序输出
returnT;
{//从二叉树排序树T中删除任意结点,其关键字为x
p=T;
//从根结点开场查找
pParent=NULL;
//T的双亲为NULL
//开场查找关键字为x的结点p,及双亲pParent
while(p)
if(x==p->
break;
pParent=p;
p=x>
p->
data?
rchild:
lchild;
}
if(p==NULL)
要删除的结点不存在\n"
returnfalse;
}//至此已找到目标结点p
//pChileNode=p存在的孩子或NULL,左右都存在时,取左
pChileNode=p->
lchild!
=NULL?
lchild:
rchild;
if(p->
lchild==NULL||p->
lchild==NULL)
{//当只存在1个孩子或2个孩子(叶子结点)都为空时,
if(pParent==NULL)//如果要删除的是根,那么把根设为找到的孩
//或NULL
T=pChileNode;
else//如果要删除的不是根
//判断一下要删除的结点是其双亲的左还是右孩子做相应处理
if(p==pParent->
lchild)
//删除结点,双亲相应的指针指向这个结点的孩子
pParent->
lchild=pChileNode;
else
rchild=pChileNode;
//同上
free(p);
//释放空间
//当2个孩子都存在时
else
{//pChileNode已指向p->
lchild
q=p;
while(pChileNode->
rchild)
{//在p的左字树中查找中序p的前驱pChileNode,q为其双亲
q=pChileNode;
pChileNode=pChileNode->
}
data=pChileNode->
data;
//p的前驱pChileNodede的关键值赋给p
if(q!
=p)//将删除p转化为删除pChileNodede(最多只有左字树)结点
{q->
rchild=pChileNode->
}//p的左字树有右孩子
lchild=pChileNode->
free(pChileNode);
returntrue;
四、上级结果及体会
1、实际完成情况:
实现二叉排序树的建立、插入、删除和查找功能;
支持的数据类型:
二叉链表。
2、程序的性能分析:
假设n个结点的二叉排序树
创立:
T(n)=O(n);
删除:
T(n)=O(n);
插入:
T(n)=O
(1)
查找:
T(n)=O(logn);
中序输出:
故程序:
T(n)=O(n+logn)
3、源程序,程序运行时的初值和运行结果〔见附件〕
4、程序的扩大和改良:
关键字类型可改为其他类型
5、上机过程中出现的问题及其解决方案:
1〕在编码删除结点DeleteNode函数的过程中遇到无法运行的问题,经请教教师,得到一定的提示:
函数设计思路要理清;
2〕在删除根结点时出现不能执行删除结点左右子树都存在的情况,近同学给出提示:
结点转换的思想;
6、收获及体会:
通过这次的课程设计,我认识到:
仅仅掌握课本上的知识是不够的,在实际操作时,常常遇到一些问题,自己看不懂,更无法解决。
不过,经过自己不断的思考,尝试着去更改代码中出现的问题。
虽然开场很困难,但在教师和同学的帮助下,我逐渐的熟悉了许多操作,为后继工作的顺利进展做了准备。
个人的力量是薄弱的,我学会了咨询别人,不再害怕,不再保守。
在过程中和同学相互讨论,询问教师,不断进步。
也许,我们可以说,编一个程仅仅是开场,调试和运行相比之下更难。
实践中收获的远比想象的多。
看到自己完成了所要求的任务,有一种无法用言语来形容的欣慰之感,这也是无法从学习书本知识中得到的。
五、参考文献
1.数据构造〔C语言版〕严蔚敏吴伟民编著清华大学
2.C程序设计〔第三版〕谭浩强编著清华大学
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉排序树 建立 插入 删除 查找