matlab编程实现二进制树搜索,数据结构: 二进制搜索树(用C语言实现)

50940b241314e8ce4a34b328876801e3.png

有关二叉树的基本知识,请参阅我的博客之一: 二叉树的链式存储

说明:

二进制排序树是具有以下属性的空树或二进制树:

1. 如果左子树不为空,则左子树上所有节点的值均小于其根节点的值;

2. 如果右子树不为空,则右子树上所有节点的值都大于其根节点的值;

3. 左右子树也是二叉排序树

aebbe15eb80c8a75a2316241f92bb870.png

说明:

6c1af9a6e9543124920401008dae6925.png

通过重复将节点插入二叉树来构造二叉树!

如果二叉树为空树二叉排序树的建立c,则将元素插入为根节点.

如果根节点的键值等于key,则插入失败;

如果键小于根节点的键值二叉排序树的建立c,它将被插入到根的左子树中;否则,它将被插入到根的右子树中

新插入的节点必须是叶节点!

代码分析:

48304ba5e6f9fe08f3fa1abda7d326ab.png

void InsertBST(BiStree &Tree,ElemType e)

{

BiStree T =Tree; //定义执行副本,!

BiStree father =NULL; //定义

while (T&&T->data.key!=e.key)

{

father=T;

if(e.key>T->data.key)

T=T->Rchild;

else

T=T->Lchild;

}

if(T) //跳出循环的只有两种情况,要么就是T不存在,要么就是找到了对应元素!T 存在说明,只能是对应元素也存在,那我我们就不用插入了

return;

BiSnode *s = (BiSnode*)malloc(sizeof(BiSnode));//能到这里,说明节点不存在,新建一个节点,并初始化!

s->data=e;

s->Rchild=s->Lchild=NULL;

if(father==NULL) //如果farther不存在,那说明就是没有执行While语句,也即是树是空的,因为一旦执行,就不会为NULL!

Tree=s;

else if(e.key>father->data.key) //到这里说明Farther存在,那么剩下的就是往farther左右节点插入元素了

father->Rchild=s;

else

father->Lchild=s;

}

d37db08a03ba1a98d2c67b8f0653a2cf.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

说明:

删除操作的基础是查找元素. 首先,您需要找到要删除的元素. 如果找到它,将其删除. 如果找不到,则无需删除它.

找到一些代码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

void DelBST(BiStree &Tree,char key)

{

if(!Tree) //如果节点为空节点,说明要删除的元素不可能存在,所以返回就好!

return;

else //下面是节点存在的分情况判断:

{

if(Tree->data.key==key) //如果找到了要删除的节点!

{

deleteNode(Tree); //删除该节点

}

else if(Tree->data.key

DelBST(Tree->Rchild,key);

else

DelBST(Tree->Lchild,key);//如果要删除的节点小于该节点,则往该节点的左子树方向进行查找

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

现在我们已经找到了元素,要删除它,我们必须实现deleteNode(Tree);方法!

0cb0fd2d263fcb13ea8572f5f0998be7.png

但是,删除元素的操作有很多情况,我们必须分别处理它们:

★要删除的节点* p是叶节点

c26dcb8c3ac18197334fd8df918b151c.png

★要删除的节点* p只是一个非空子树

a65ee81fb10e233dd594d295f43f1148.png

★要删除的节点* p具有两个非空子树

60702b8caf19fafc4063b14521326520.png

如何找到直接的前任: 找到要删除的节点的第一个左子树,然后继续向右走!

158714ce4920e5940136169874e7d7ca.png

删除代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

void deleteNode(BiStree &p)

{

if(!p->Rchild) //对第一种及第二种情况的处理

{

BiSnode * q =p;

p=p->Lchild;

free(q);

}

else if(!p->Lchild) //对第一种及第二种情况的处理

{

BiSnode * q =p;

p=p->Rchild;

free(q);

} else

{

BiSnode * q =p;

BiSnode * s =p->Lchild;

while (s->Rchild)

{

q=s;

s=s->Rchild;

}

//s指向被删节点p的前驱

p->data=s->data;

if(q!=p) //详见下两图

q->Rchild=s->Lchild; //左图

else

q->Lchild=s->Lchild; //右图

free(s);

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

3177041e43172fe1173936f95730ae52.png

4e59cdf3354e246a92ca02aed22bc149.png

该代码不会被降级,非常简单!

查找键值为K的记录:

如果二进制排序树是空树,则搜索失败并返回;

如果根节点的键值等于key,则搜索成功并返回;

如果根节点的键值大于key,则继续在根的左子树上搜索;否则,继续在根的右子树上搜索

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-177261-1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

植物的意识,是我们的错觉吗?

来源:原理说到生物,你脑海中第一反应会浮现出什么?大象、狮子、蚂蚁……很多时候,我们可能会不由自主地忽略另一群重要的“地球邻居”。虽然植物占地球生物量的80%以上,但长久以来,它们一直会被忽略和低估。…

php $handle,laravel $kernel-handle 报错的解决办法_PHP开发框架教程

yii和zend框架的区别是什么?_PHP开发框架教程Yii框架和zend框架的区别:zend的功能强大,但基本百分之八十的功能你用不到;学习速度功能,效率方面,YII会略胜。Q:我的项目启动时报错laravel $kerne…

纪念机器翻译概念的诞生:重新认识瓦伦·韦弗先生

来源:AI科技评论作者:张家俊编辑:丛 末机器翻译旨在利用计算机实现自然语言之间的自动翻译,一直是自然语言处理与人工智能领域的重要研究方向,近年来更是取得了突破性进展,已成为大众较为熟知和常用的技术…

php 怎样清除浏览器痕迹,如何清除电脑使用痕迹?上网痕迹清理的方法介绍

当我们上网的时候,会使用电子信箱,会登录很多论坛类网站,这样就会留下账号;可能会访问一些网站,这样会留下上网信息;可能会登录一些电子商务网站,那账号和密码则会默认保存在系统之中&#xff0…

兰德报告《现代战争中的全域联合指挥控制--一种确定和开发人工智能应用的分析框架》...

本文来源:兵推天下本报告作者研究了美国空军应用人工智能(或更广泛的自动化系统)进行有计划全域联合指挥控制规划的机会并给出了相关建议。作者发现,要为未来多域战提供支持,必须协调以下三个范畴的内容:1)…

实现内、外网同时访问

不少公司的网管试图解决双网卡问题,下面我就给大家详细的讲解一下双网卡同时使用的方法,这样即可保障内网的安全,又能解决电脑访问外网的问题,一举两得。希望大家喜欢。 首先你的机器需要有两块网卡,分别接到两台交换机…

日本面向未来的特定科技领域技术预见分析

作者:王达,中国科协创新战略研究院本文转载自微信公众号科学家,原载于《今日科苑》2020年第5期目前,全球面临的环境、人口变化、资源、粮食和能源安全等问题亟待解决,先进的测量技术与信息处理技术的深度融合可以刺激更…

oauth2.0 php简化模式,OAuth2.0学习(1-5)授权方式2-简化模式(implicit grant type)

授权方式2-简化模式(implicit grant type)简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是…

人与人工的智能区别

来源:人机与认知实验室是非之心,智也! 为什么说这不仅仅是指伦理道德,其实,这涉及到人之智能、智慧的根本:非逻辑推理性的判断! 机器的判断是逻辑推理性的,对环境的适应性自然就弱了一些。作家菲茨杰拉德的…

AI大觉醒:图灵奖得主Bengio称AI将产生意识,未来机器学习核心是注意力机制

来源:人工智能AI技术人工智能会产生意识吗?这是一直以来美剧《西部世界》中探讨的问题。AI主人公觉醒,意识到这个世界是人类杀伐主宰的乐园,于是开启了逆袭之路。2020年ICLR上,图灵奖得主、蒙特利尔学习算法研究所主任…

人类应鼎力进行探索的35种颠覆性技术

本文转载自“战略前沿技术”,原标题《人类应鼎力进行探索的35种颠覆性技术》人类文明的进步,只要出现难以逾越的障碍,必然给人类的发展带来迷茫和灾难。而解决的路径只有一个:科技探索和创新。只有鼎力进行中的科技探索&#xff0…

【codevs2488】绿豆蛙的归宿

这个题开始正向拓扑排序,然后各种wa,心灰意冷,找了个题解,和同学研究了半天,甚至曾经一度认为题解是错的。 这个题正向反向应该都无所谓,但是我实在是蒻,打了半天正向都没打过去,最后…

半导体光刻机行业深度报告:复盘ASML,探寻本土光刻产业投资机会

报告来源:西南证券1、 提要:光刻工艺是晶圆制造最核心环节,光刻产业链协同发展成为光刻机突破关键因子1.1 光刻定义晶体管尺寸,光刻工艺合计占芯片成本近 30% 2019 年全球半导体市场规模达 4090 亿美元,成为数码产业的…

C语言的参数传递原理解析(值传递)

本讲我们和大家一起来聊一聊C语言中有关参数传递的一些知识。 1.问题引入 请写出以下程序的打印结果。 #include // 将某整数加10 void add_by_10(int a){ a a 10; } int main(int argc, char *argv[]){ int a 2; add_by_10(a); printf("a %d\n", a); 上面的程序非…

字符串php手册,php知识点复习之字符串

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 /*echo mark qqqqqq\nqqqqqqbrqqqqqqqqqqqqq\rqqqqqqqqqqqqqqqqqq mark*/ //技术标志要另起一行,并且是顶格写! //作用跟""类似//最致命的一点是:mark后面…

一个诡异的循环:意识何以意识到意识自身?

© Lia Koltyrina / Shutterstock本文经公众号利维坦(ID:liweitan2014)授权转载存在的感觉可能只是一种感觉。——本凯利夫(Ben L. Callif)与其他事物相同,我似乎身处宇宙漩涡的中心,整个宇…

美军重视扩展现实技术的研究和应用

来源: 知远战略与防务研究所 编译:王绍祺美国陆军退役中将苏珊劳伦斯曾担任陆军G-6首席信息官、网络企业技术司令部司令,现为埃森哲联邦服务公司武装部队部门总经理。苏珊劳伦斯在美国《信号》杂志2019年10月号发表文章,指出扩展…

寒武纪开盘暴涨350%,市值突破1000亿,85后创始人身家超300亿!千亿盛宴背后隐忧不可忽视!...

来源:EETOP7月20日,寒武纪科创板首发上市,发行价每股64.39元,开盘价为250元/股,涨幅288%。最高价更是达到了295元/股,涨幅358%!市值一度突破1000亿人民币,不过随后股民信心有所不足&…

Mac上的抓包工具Charles

今天就来看一下Mac上如何进行抓包,之前有一篇文章介绍了使用Fidder进行抓包 http://blog.csdn.net/jiangwei0910410003/article/details/19806999 不过可惜的是,Fidder使用C#开发的,所以就不能在Mac上使用了,不过还有另外一个抓包…

oracle 在所有表中查某个值,oracle需要查询某个字段的值在其他某个表中有没的值有相同...

使用场景:知道某个字段的值(例如:“张三”),需要查询在其他某个表中有没有相同的值,常用于搜索关联表等。对于oracle数据库:Pl\sql没有搜索功能,需借助存储过程,完成搜索,搜索结果是…