数据结构:二叉查找树(C语言实现)

数据结构:二叉查找树

二叉查找树

基础知识

  关于二叉树的基础知识,请看我的一篇博客:二叉树的链式存储

 

 

二叉查找树的特征

  二叉查找树或者是一棵空树,或者是具有下列性质的二叉树:
  1.若其左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2.若其右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3.其左、右子树也分别为二叉排序树

 

二叉查找树的建立

  反复插入节点所构造出来的!若二叉树为空树,则插入元素作为树根节点。若根结点的键值等于key,则插入失败;若key小于根结点的键值,则插入到根的左子树上;否则,插入到根的右子树上新插入的节点一定是一个叶子节点!

代码分析

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;elseT=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;elsefather->Lchild=s;
}

  

删除运算

  删除运算是的基础是查找元素,首先要查找要删除的元素,如果找到就删除,找不到就不用删除了。

查找代码

void DelBST(BiStree &Tree,char key)
{if(!Tree) //如果节点为空节点,说明要删除的元素不可能存在,所以返回就好!return;else //下面是节点存在的分情况判断:{if(Tree->data.key==key) //如果找到了要删除的节点!{deleteNode(Tree);   //删除该节点}else if(Tree->data.key<key)  //如果要删除的节点大于该节点,则往该节点的右子树方向进行查找DelBST(Tree->Rchild,key);elseDelBST(Tree->Lchild,key);//如果要删除的节点小于该节点,则往该节点的左子树方向进行查找}
}

  到现在我们已经找到元素了 ,要对其删除,就是要实现deleteNode(Tree);方法!
  但是删除元素的运算是存在多种情况的,我们要分别处理:
    ★待删除的结点*p是个叶子结点

  

    ★待删除的结点*p是仅有一个非空子树

  

    ★待删除的结点*p有两个非空子树

  

    如何找出直接前驱:找到要删除节点的第一个左子树然后一直向右!   

删除代码

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;    //左图elseq->Lchild=s->Lchild;    //右图free(s);}}

    

转载于:https://www.cnblogs.com/MrSaver/p/6087402.html

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

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

相关文章

Effective Java 电子书 apk版本下载

下载安装包以后&#xff0c;安装即可阅读该书了&#xff0c;并且实时展示每章节代码哦&#xff0c;并且可以运行哦&#xff0c;赶快下载体验吧. Effective Java中文第二版下载地址&#xff1a;下载 应用截图&#xff1a; 转载于:https://www.cnblogs.com/spring87/p/6090010.ht…

SpringBoot解决ajax跨域问题

From: https://www.jianshu.com/p/e57ed1ee3070 利用注解的方式解决AJAX请求跨域问题一、第一种方式: 1、编写一个支持跨域请求的 Configuration import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.…

dataguru北京线下沙龙-第二部 《Oracle 索引优化思路--案例分享 -- 刘盛》

【视频&#xff1a;dataguru北京线下沙龙-第二部 《Oracle 索引优化思路--案例分享 -- 刘盛》 /微笑】

1^2+2^2+……+n^2的公式证明

求^2就从^3入手,求^3就从^4入手,求^t就从^(t1)入手 因为(n1)^3n^33n^23n1 所以2^31^33*1^23*11 3^32^33*2^23*21 …… (n1)^3n^33n^22n1 所以2^33^3……(n1)^31^32^3……3*(1^22^2……^2)3(12……n)(11……1) 所以3(1^22^2……n^2)n^33n^22n1-a-3-[n(n1)]/2-n 所以S(An)1^22^2……

mysql 数据库授权(给某个用户授权某个数据库)

先设置该用户只有show database权限grant select,insert,update,delete on redmine1.* to jira"%" identified by "jira";授权命令GRANT 语句的语法如下&#xff1a;GRANT privileges (columns)ON whatTO user IDENTIFIEDBY "password"WITH GRAN…

Nginx突破高并发的性能优化 - 运维笔记

在日常的运维工作中&#xff0c;经常会用到nginx服务&#xff0c;也时常会碰到nginx因高并发导致的性能瓶颈问题。今天这里简单梳理下nginx性能优化的配置&#xff08;仅仅依据本人的实战经验而述&#xff0c;如有不妥&#xff0c;敬请指出~&#xff09; 一、这里的优化主要是指…

给你的Mr.Right画张择偶地图像

爱一个人就算做不到爱他的全部&#xff0c;至少也应该尊重他的真实&#xff0c;而不是苛求他变成你想要的样子。 娶妻当娶郭芙蓉&#xff0c;经典语录。我是郭芙蓉&#xff0c;我不会武功&#xff0c;我来自江湖&#xff0c;我与众不同。再苦再累&#xff0c;就当自己是二百五&…

ISO13485给企业带来的益处

1、ISO13485变强制性认证&#xff0c;日益受到欧美和中国政府机构的重视&#xff0c;有利于消除国际贸易中的技术壁垒&#xff0c;是进入国际市场的通行证&#xff1b; 2、提高和改善企业的管理水平&#xff0c;增加企业的知名度&#xff1b; 3、提高和保证产品的质量水平&…

[HDOJ5289]Assignment(RMQ,二分)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5289 题意&#xff1a;求满足区间内最大值和最小值差为k的区间个数。 预处理出区间的最值&#xff0c;枚举左端点&#xff0c;根据最值的单调性二分枚举右端点&#xff0c;使得找到最右侧max-min<k&#xff…

java实现HTTP请求的三种方式

From: https://www.cnblogs.com/hhhshct/p/8523697.html 目前JAVA实现HTTP请求的方法用的最多的有两种&#xff1a;一种是通过HTTPClient这种第三方的开源框架去实现。HTTPClient对HTTP的封装性比较不错&#xff0c;通过它基本上能够满足我们大部分的需求&#xff0c;HttpClien…

ActiveMQ queue 代码示例

生产者&#xff1a; package com.111.activemq;import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessa…

SpringBoot时间戳与MySql数据库记录相差14小时排错

From: http://www.cnblogs.com/jason1990/archive/2018/11/28/10032181.html 项目中遇到存储的时间戳与真实时间相差14小时的现象,以下为解决步骤. 问题 CREATE TABLE incident (id int(11) NOT NULL AUTO_INCREMENT,created_time timestamp NOT NULL DEFAULT CURRENT_TIMES…

HDU 1233 还是畅通工程(最小生成树)

传送门 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 41447 Accepted Submission(s): 18920 Description 某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅…

出了本练内功的书:《完美软件开发:方法与逻辑》

首先说下什么叫“完美软件开发”&#xff0c;想象一下&#xff0c;完美的圆在现实中是不存在的&#xff0c;现实中的圆只能是对完美的圆的回归&#xff0c;但完美的圆描述了圆的构成规则&#xff0c;完美软件开发意义与此相同&#xff0c;它试图描述软件开发的规则和铁律。但既…

Springboot后台接收前端Date类型

From: https://my.oschina.net/zicheng/blog/2963117 这个问题不是专门针对Springboot的&#xff0c;Springmvc也同样适用于这一个问题。 昨的是Springboot前后端分离的项目&#xff0c;今天和前端对接口发现前端的请求走不到后台&#xff0c;检查了请求什么的都没有问题&…

关于jTopo的引用

jTopo是一款 2 D和3D模型展示的插件&#xff0c;不过目前文档不是很齐全&#xff0c;刚开始看的时候就有点懵了&#xff0c;因为你在网上很难找到jTopo的资料。下面我就介绍一下jTopo 的引用吧。 1、首先在官网上下载到jTopo的包&#xff0c;地址&#xff1a;http://www.jtopo.…

mysql重置root密码方法

2019独角兽企业重金招聘Python工程师标准>>> 1. 先关闭mysqld 2. 运行&#xff1a; mysqld_safe --skip-grant-tables 3. 另开一个窗口&#xff0c;用 mysql -uroot 登录mysql&#xff0c;执行 UPDATE mysql.user SET PasswordPASSWORD(你的密码) WHERE User…

插入排序之C++实现

描述 插入排序是一种简单直观的排序算法。它的基本思想是将一个待排序的数据序列分为已排序和未排序两部分&#xff0c;每次从未排序序列中取出一个元素&#xff0c;然后将它插入到已排序序列的适当位置&#xff0c;直到所有元素都插入完毕&#xff0c;即完成排序。 实现思路…

spring boot使用logback实现多环境日志配置

From: https://blog.csdn.net/vitech/article/details/53812137 软件生存周期中&#xff0c;涉及代码运行的环节有编码、测试和维护阶段&#xff0c;而一套成熟的代码&#xff0c;在此三个阶段&#xff0c;数据库、日志路径、日志级别、线程池大小等配置一般会不一样。作为开发…

IOT(Index Organized Table)

我们知道一般的表都以堆(heap)的形式来组织的&#xff0c;这是无序的组织方式。Oracle还提供了一种有序的表&#xff0c;它就是索引组织表&#xff0c;简称IOT表。IOT表上必须要有主键&#xff0c;而IOT表本身不对应segment&#xff0c;表里所有的数据都存放在主键所在的索引的…