版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
二叉搜索树(BinarySearchTree)定义
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同。左子树(如果非空)上所有结点的关键码都小于根结点的关键码。右子树(如果非空)上所有结点的关键码都大于根结点的关键码。左子树和右子树也是二叉搜索树。1351545504025102030二叉搜索树例结点左子树上所有关键码小于结点关键码;右子树上所有关键码大于结点关键码;注意:若从根结点到某个叶结点有一条路径,路径左边的结点的关键码不一定小于路径上的结点的关键码。如箭头所示路径。2性质:如果对一棵二叉搜索树进行中序遍历,可以按从小到大的顺序,将各结点关键码排列起来,所以也称二叉搜索树为二叉排序树(BST)。二叉搜索树的类定义——略二叉搜索树的类定义用二叉链表作为它的存储表示,许多操作的实现与二叉树类似。3二叉搜索树的搜索算法在二叉搜索树上进行搜索,是一个从根结点开始,沿某一个分支逐层向下进行比较判等的过程。它可以是一个递归的过程。假设想要在二叉搜索树中搜索关键码为x
的元素,搜索过程从根结点开始。如果根指针为NULL,则搜索不成功;否则用给定值
x
与根结点的关键码进行比较:若给定值等于根结点关键码,则搜索成功,返回搜索成功信息并报告搜索到结点地址。4若给定值小于根结点的关键码,则继续递归搜索根结点的左子树;否则。递归搜索根结点的右子树。搜索45搜索成功搜索28搜索失败3515455040251020305BSTNode*Search(Tx,
BSTNode*subtree){//递归算法:在以
subtree
为根的二叉搜索树中//
搜索含x的结点。若找到,则函数返回该结点//的地址,否则函数返回NULL值。 if(subtree==NULL)returnNULL;
elseif(x<subtree->data) returnSearch(x,subtree->left); elseif(x>subtree->data) returnSearch(x,
subtree->right); elsereturnsubtree; //搜索成功}6BSTNode*Search(Tx,
BSTNode*subtree){//迭代算法:在当前以subtree
为根的二叉搜索//树中搜索含x的结点。若找到,则函数返回该//结点的地址,否则函数返回NULL值。while(subtree!=NULL){
if(x==subtree->data)returnsubtree; if(x<subtree->data)
subtree=subtree->left; elsesubtree=subtree->right;}returnNULL;}7搜索过程是从根结点开始,沿某条路径自上而下逐层比较判等的过程。搜索成功,搜索指针将停留在树上某个结点;搜索不成功,搜索指针将走到树上某个结点的空子树。设树的高度为h,最多比较次数不超过h。8二叉搜索树的插入算法为了向二叉搜索树中插入一个新元素,必须先检查这个元素是否在树中已经存在。在插入之前,先使用搜索算法在树中检查要插入的元素在不在树中。如果搜索成功,说明树中已经有这个元素,不再插入;如果搜索不成功,说明树中原来没有关键码等于给定值的结点,把新元素加到搜索操作停止的地方。9插入新结点
28二叉搜索树的插入每次结点的插入,都要从根结点出发搜索插入位置,然后把新结点作为叶结点插入。3515455040251020302810二叉搜索树的插入算法bool
Insert(Te,BSTNode&subtree){//递归算法:在以subtree
为根的二叉搜索树中插入//值为e的结点。若树中已有结点e,则不插入
if(subtree==NULL){//新结点作为叶结点插入
subtree=newBSTNode(e);//创建新结点 returntrue;}elseif(e<subtree->data)Insert(e,subtree->left); elseif(e>subtree->data)Insert(e,subtree->right);};11注意参数表中引用型指针参数subtree的使用。利用二叉搜索树的插入算法,可以很方便地建立二叉搜索树。
12输入数据
{53,78,65,17,87,09,81,15}53537853786553786517537865871753786509178753786581178709537865151787098113voidcreateBST(TEndValue){//从键盘上输入元素序列,建立一棵二叉搜索树,//参数
EndValue
表示序列的结束符
root=NULL;//root为树根,初始化为空树
cin>>x; //输入数据
while(x.key!=EndValue){ //RefValue是一个输入结束标志
Insert(x,root);cin>>x; //插入,再输入数据
}}14二叉搜索树的删除算法在二叉搜索树中删除一个结点时,必须将因删除结点而断开的二叉链表重新链接起来,同时确保二叉搜索树的性质不会失去。为保证在删除后树的搜索性能不至于降低,还需要防止重新链接后树的高度增加。删除叶结点,只需将其双亲结点指向它的指针清零,再释放它即可。被删结点右子树为空,可以拿它的左子女结点顶替它的位置,再释放它。15被删结点左子树为空,可以拿它的右子女结点顶替它的位置,再释放它。被删结点左、右子树都不为空,可以在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删结点中,再来处理这个结点的删除问题。5378651787092345删除45右子树空,用左子女顶替53786517870923168853788817940923删除78左子树空,用右子女顶替53948817092353788117940945删除78在右子树上找中序下第一个结点填补236553818817940945236517二叉搜索树的删除算法bool
Remove(x,BSTNode&subtree){//递归算法:在以subtree
为根的二叉搜索树中//
删除含x的结点
if(subtree==NULL)return
false;
if(x<subtree->data)//在左子树中执行删除 returnRemove(x,subtree->left);
elseif(x>subtree->data)//在右子树中执行删除
return
Remove(x,subtree->right);
else{//
找到了被删结点18
//1.左、右子女均不空 if(subtree->left!=NULL&&
subtree->right!=NULL){ //subtree指示关键码为x的结点,它有两个子女 temp=subtree->right;
//到右子树搜寻中序下第一个结点
while(temp->left!=NULL)temp=temp->left;
subtree->data=temp->data;
//用该结点数据代替根结点数据 Remove(temp->data,subtree->right); }19 else{//subtree指示的结点最多有一个子女 temp=subtree;
if(subtree->left==NULL)subtree=
subtree->right; elsesubtree=subtree->left;deletetemp; returntrue; } }}注意在删除算法参数表引用型指针参数的使用。20
二叉搜索树性能分析对于有n个关键码的集合,其关键码有n!种不同排列,可构成不同二叉搜索树有
(棵)
{2,1,3}{1,2,3}{1,3,2}{2,3,1}{3,1,2}{3,2,1}
12311113222332321同样3个数据{1,2,3},输入顺序不同,建立起来的二叉搜索树的形态也不同。这直接影响到二叉搜索树的搜索性能。如果输入序列选得不好,会建立起一棵单支树,使得二叉搜索树的高度达到最大。用树的搜索效率来评价这些二叉搜索树。为此,在二叉搜索树中加入外结点,形成判定树。外结点表示失败结点,内结点表示搜索树中已有的数据。这样的判定树即为扩充的二叉搜索树。22举例说明。已知关键码集合
{a1,a2,a3}=
{do,if,to},对应搜索概率p1,p2,p3,在各搜索不成功间隔内搜索概率分别为q0,q1,q2,q3。可能的二叉搜索树如下所示。doiftodoiftoq0q1p1q2p2q3p3q0q1q2q3p1p2p3(a)(b)23判定树doiftoq0q1p1q2p2q3p3doiftoq0q1p1q2p2q3p3(d)(c)doiftoq0q1p1q2p2q3p3(e)24在判定树中
○表示内部结点,包含了关键码集合中的某一个关键码;□表示外部结点,代表各关键码间隔中的不在关键码集合中的关键码。在每两个外部结点间必存在一个内部结点。一棵判定树上
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版高科技产品出口许可与合同履行协议3篇
- 二零二五版国际贸易合同担保法风险管理合同3篇
- 碎石加工设备2025年度保险合同2篇
- 二零二五版企业员工劳务派遣与员工福利保障合同3篇
- 二零二五年度粮食储备与农业产业化合作合同3篇
- 二零二五年度高层综合楼公共收益分配管理合同3篇
- 二零二五年度校车运营服务与儿童座椅安全检测合同3篇
- 二零二五版带储藏室装修包售二手房合同范本3篇
- 二零二五年房地产合作开发与股权让渡综合合同2篇
- 二零二五年度花木种植与生态农业园区建设合同3篇
- 毕淑敏心理咨询手记在线阅读
- 亚硝酸钠安全标签
- pcs-985ts-x说明书国内中文版
- GB 11887-2012首饰贵金属纯度的规定及命名方法
- 小品《天宫贺岁》台词剧本手稿
- 医院患者伤口换药操作课件
- 欠薪强制执行申请书
- 矿山年中期开采重点规划
- 资源库建设项目技术规范汇编0716印刷版
- GC2级压力管道安装质量保证体系文件编写提纲
- 预应力混凝土简支小箱梁大作业计算书
评论
0/150
提交评论