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…

CodeForces 869E The Untended Antiquity 二维树状数组,随机hash

CodeForces 869E 题意: n*m 的格子,有三种操作, 1、在一个矩形周围加一层障碍。2、把一个矩形周围的障碍去掉。 3、询问两个格子是否可达。 题目保证不会有矩形障碍交叉,且去掉的矩形一定是在前面已给出的。 tags&#xff1a…

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

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

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

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

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

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

实现内、外网同时访问

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

java swing 多个线程,Swing与多线程

1)如果要在图形界面上显示经过数据查询或经过其他方式得来的数据,一般将这个过程放在一个线程中,由该线程进行单独运算,并随时更新图形界面。(2)Swing线程发生死锁的时候,如果是使用命令行的方式运行的该程序,可以使用…

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

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

Prototype模式

原型模式创建对象不调用原对象的构造函数,是直接copy原对象的浅克隆:对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.深克隆:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制. …

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

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

人与人工的智能区别

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

Swift UISearchController

1.遵守协议 UISearchController 2.变量声明 var sc :UISearchController! 3.viewDidLoad中实现 sc UISearchController(searchResultsController: nil) sc.searchResultsUpdater self sc.dimsBackgroundDuringPresentation false//是否添加半透明覆盖层 self.tableView.tab…

matlab的三维伪彩图,matlab画等高线伪彩图

exp(-x.*x-y.*y); con tour3(z,20); title(三维等值线图); xlabel( X ),ylabel( Y ),zlabel( Z); grid; 4) 打印函数的伪彩色图......MATLAB总结 - 三维图形、等高线_数学_自然科学_专业资料。个人总结的一些...(系) 物电学院 专业班级 电子信息科学与技术 1103 指导教师 蒋媛 …

nginx基本配置与参数说明

#运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1;#全局错误日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;#工作模式及连接数上限 events {…

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

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

php 文件指定位置添加内容,C++_VC++在TXT文件指定位置追加内容的方法,本文实例讲述了VC++操作文本文 - phpStudy...

VC在TXT文件指定位置追加内容的方法本文实例讲述了VC操作文本文件的方法,实现在txt文件指定位置插入内容。对于VC爱好者有一定的学习参考价值。主要功能代码如下:void CGoToFileDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this);SendMessage(WM_ICONER…

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

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

【codevs2488】绿豆蛙的归宿

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

php读取某类型文件代码,php代码实现读取文件头判断文件类型

php代码实现读取文件头判断文件类型,支持图片、rar、exe等后缀。案例://为图片的路径可以用d:/upload/11.jpg等绝对路径$file fopen($filename, "rb");$bin fread($file, 2); //只读2字节fclose($file);$strInfo unpack("C2chars"…