【Java数据结构】二叉搜索树增、插,删,创详解(1)

数据结构——二叉搜索树(用java实现) ​二叉搜索树以其独特的二分智慧,成为高效数据管理的经典之作。它不仅仅是一个存储数据的容器,更是一把打开快速查找、动态排序与灵活更新之门的钥匙——从数据库索引到实时推荐系统,从编译器设计到机器学习,BST的身影无处不在。 阅读详情

}else {

parent.right = node;

}

return true;

}

④操作-删除

==========

删除操作较为复杂,但理解了其原理还是比较容易

设待删除结点为 cur, 待删除结点的双亲结点为 parent

1. cur.left == null

1. cur 是 root,则 root = cur.right

2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.right

3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.right

2. cur.right == null

1. cur 是 root,则 root = cur.left

2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.left

3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.left

第二种情况和第一种情况相同,只是方向相反,这里不再画图

3. cur.left != null && cur.right != null

需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题

当我们在左右子树都不为空的情况下进行删除,删除该节点会破坏树的结构,因此用替罪羊的方法来解决,实际删除的过程还是上面的两种情况,这里还是用到了搜索二叉树的性质

public void remove(Node parent,Node cur) {

if(cur.left == null) {

if(cur == root) {

root = cur.right;

}else if(cur == parent.left) {

parent.left = cur.right;

}else {

parent.right = cur.right;

}

}else if(cur.right == null) {

if(cur == root) {

root = cur.left;

}else if(cur == parent.left) {

parent.left = cur.left;

}else {

parent.right = cur.left;

}

}else {

Node targetParent = cur;

Node target = cur.right;

while (target.left != null) {

targetParent = target;

target = target.left;

}

cur.val = target.val;

if(target == targetParent.left) {

targetParent.left = target.right;

}else {

targetParent.right = target.right;

}

}

}

public void removeKey(int key) {

if(root == null) {

return;

}

Node cur = root;

Node parent = null;

while (cur != null) {

if(cur.val == key) {

remove(parent,cur);

return;

}else if(cur.val < key){

parent = cur;

cur = cur.right;

}else {

parent = cur;

cur = cur.left;

}

}

}

⑤性能分析

=========

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。

对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度 的函数,即结点越深,则比较次数越多。

但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:

最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:

最差情况下,二叉搜索树退化为单支树,其平均比较次数为:

⑥完整代码

public class TextDemo {

public static class Node {

public int val;

public Node left;

public Node right;

public Node (int val) {

this.val = val;

}

}

public Node root;

/**

  • 查找

  • @param key

*/

public Node search(int key) {

Node cur = root;

while (cur != null) {

if(cur.val == key) {

return cur;

}else if(cur.val < key) {

cur = cur.right;

}else {

cur = cur.left;

}

}

return null;

}

/**

  • @param key

  • @return

*/

public boolean insert(int key) {

Node node = new Node(key);

if(root == null) {

root = node;

return true;

}

Node cur = root;

Node parent = null;

while(cur != null) {

if(cur.val == key) {

return false;

}else if(cur.val < key) {

parent = cur;

cur = cur.right;

}else {

parent = cur;

cur = cur.left;

}

}

//parent

if(parent.val > key) {

parent.left = node;

}else {

parent.right = node;

}

return true;

}

public void remove(Node parent,Node cur) {

if(cur.left == null) {

if(cur == root) {

root = cur.right;

}else if(cur == parent.left) {

parent.left = cur.right;

}else {

parent.right = cur.right;

}

}else if(cur.right == null) {

if(cur == root) {

root = cur.left;

}else if(cur == parent.left) {

parent.left = cur.left;

}else {

parent.right = cur.left;

}

}else {

Node targetParent = cur;

Node target = cur.right;

while (target.left != null) {

targetParent = target;

target = target.left;

}

cur.val = target.val;

if(target == targetParent.left) {

targetParent.left = target.right;

}else {

targetParent.right = target.right;

}

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!

小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
取!!(备注Java获取)**

img

最后

由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!

[外链图片转存中…(img-OCdOV9Et-1713395693627)]

小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》

[外链图片转存中…(img-9tevxKbI-1713395693627)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

AI原生应用在UGC内容审核中的实战经验 AI原生应用(AI-Native Application)——以机器学习模型为核心驱动力,深度整合数据、算法、工程架构的完整系统——为破解这一三角难题提供了全新范式。全链路数据驱动:从数据采集、模型训练到决策优化,形成闭环自治系统,无需人工规则干预多模态深度理解:同时处理文本、图像、音频、视频等多类型内容,理解语义而非简单匹配特征自适应进化能力:通过人机协同反馈持续学习新型违规模式,模型周级迭代成为常态审核效率提升300%:单条视频审核耗时从2.3秒降至0.7秒。 阅读详情

相关推荐

数字蓝军智能体关键技术课题研究

本研究提出基于人工智能大模型技术构建智能数字蓝军智能体系统,旨在提升作战模拟推演的智能化水平。系统采用"大模型+小模型"混合架构,整合感知、决策、规划、学习等核心模块,实现动态、智能的作战方案生成。关键技术包括大模型与知识图谱融合、多智能体协同、战场态势数字化表示等。研究成果将形成可复用的垂直领域智能体框架,为军事训练提供智能化对抗平台。该系统不仅能模拟真实对手的决策行为,还能通过自我博弈持续进化,有效增强推演的真实性和对抗性。

weixin_49042442的博客 1547

【Java数据结构】二叉搜索树增、插,删,创详解

搜索二叉树详解

耀的博客 2537

tuts4you-lena151-Crackme-tutorial06

一、前言      本次研究的是lena151-Crackme-tutorial06,也是一个应用程序,但因为平台迭代的关系,程序不能正常运行,只能完成部分破解。 (一)·本次我们要破解的目标是个应用程序,如下图 (二)、使用工具:x32dbg 二、过程 这个程序的破解的方法很多,首先最简单的一种不外乎就是搜索字符串,我就按照这个思路来完成。 (一)查找字符串&lt;Unregis...

h123120的专栏 518

【数据结构多彩画卷】不要只会普通的二叉树了 , 你听说过用二叉树来排序吗? 【二叉搜索树】会带给你惊喜 !! !(万字详解)

二叉搜索树,如数据世界的神秘钥匙,开启高效数据管理之门。它以独特的结构,让数据有序排列,犹如智慧的阶梯,引领我们快速攀登信息高峰。在算法的舞台上,二叉搜索树翩翩起舞,展现出无与伦比的魅力,吸引着无数探索者深入其中,揭开它的神秘面纱。让我们一同踏上这奇妙的数据结构之旅,领略二叉搜索树的精彩之处!

mgzdwm的博客 4902

cordic算法的FPGA实现

cordic 算法的MATLAB仿真及verilog实现

qq_38360574的博客 1674

强网杯Web题ezphp解题全记录:利用PHP反序列化与条件竞争拿下服务器

本文详细解析了强网杯Web题目ezphp的解题过程,通过PHP反序列化与条件竞争漏洞的组合利用,成功获取服务器权限。文章深入剖析了反序列化链的构造、文件上传绕过技巧以及条件竞争的实际应用,为CTF选手和Web安全研究者提供了宝贵的实战经验。

weixin_29006187的博客 376

Java 【数据结构】 TreeSet&TreeMap(二叉搜索树详解)【神装】

每个节点都有一个键(Key)和两个指向其他节点的指针(左子指针和右子指针)。任意节点的左子树中的所有键都小于该节点的键。任意节点的右子树中的所有键都大于该节点的键。左右子树也都是二叉搜索树。不存在键值相等的节点。int val;Node left;Node right;// 构造函数、插入方法、查找方法、删除方法等...TreeSet是Java集合框架中的一种有序集合,它实现了Set接口,因此具有不允许重复元素的特性。

2302_79806056的博客 6692

在Cursor中集成Ollama与Qwen2.5‑Coder:零成本本地AI开发环境搭建

本文详细介绍了如何零成本搭建本地AI开发环境,通过将Cursor IDE与本地运行的Ollama及Qwen2.5-Coder模型集成,实现数据不出本地的智能编程辅助。教程涵盖Ollama安装、模型拉取、ngrok内网穿透配置及Cursor设置等核心步骤,并提供了实战测试与常见问题排错指南,为注重隐私与成本的开发者提供安全高效的解决方案。

weixin_29296241的博客 1071

Java 数据结构篇-实现二叉搜索树的核心方法

由于其特性,二叉搜索树在插入、删除和搜索操作上具有较高的效率。在平均情况下,这些操作的时间复杂度为 O(log n),其中 n 为树中节点的数量。然而,如果树的结构不平衡,最坏情况下这些操作的时间复杂度可能会达到 O(n)。由于其高效的搜索特性,二叉搜索树常被用于实现关联数组和集合等数据结构。然而,为了避免树的结构不平衡导致性能下降,人们也发展了平衡二叉搜索树(如红黑树、AVL树)等变种。

小扳手 1万+

ArcGIS | 全球新冠肺炎地图数据下载和处理

ArcGIS

thinkpang的博客 2900

别再乱装了!Win10下NVIDIA显卡驱动、CUDA 11.0和cuDNN 8.0.5保姆级配置指南(含版本匹配避坑)

本文提供Win10下NVIDIA显卡驱动、CUDA 11.0和cuDNN 8.0.5的保姆级配置指南,详细解析版本匹配逻辑与安装步骤。从驱动选择到环境变量配置,再到框架测试,手把手教你避开常见坑点,确保深度学习环境一次配置成功。特别强调版本匹配的重要性,帮助开发者高效搭建GPU开发环境。

weixin_30600197的博客 307

【Java 数据结构】实现一个二叉搜索树

本期主要讲解: 1、认识二叉搜索树 2、实现一个二叉搜索树 2.1 成员变量 2.2 insert 方法 2.3 search 方法 2.4 remove 方法(重点) 3、二叉搜索树总结

程序猿教你打篮球的博客 7502

Xilinx FPGA平台GTX简易使用教程(五)GTX收发测试及示例工程介绍

GTX IP配置完了,你不得搞个回环测试一番?

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

【数据结构】Java中Map和Set详解(含二叉搜索树和哈希表)

在Java中Map和Set最常见到下面四个实现类,HashMap/TreeMap/HashSet/TreeSet,他们分别与两种数据结构相关,二叉搜索树和哈希表,下面的文章中我会详解这两种数据结构,以及Java是怎样对这两种数据结构进行实现的。

2203_75565612的博客 1501

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【数据结构】二叉搜索树

二叉搜索树的增删查

yj20040627的博客 2556

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数据结构——二叉搜索树

二叉搜索树又称为(二叉排序树、二叉查找树),什么是二叉搜索树?它是一棵空树,或者具有下列性质的二叉树 ① 它的左子树不为空,则左子树上所有的节点的值均小于它的根节点的值。 ② 它的右子树不为空,则右子树上所有的节点的值均大于它的根节点的值。 ③ 它的左、右子树也分别为二叉搜索树。二叉搜索树的中序遍历的数据是一个已排序好的数据。然而,构造一棵二叉搜索树的目的,不是为了排序,而是为了提高查找、添加、删除数据的速度。本篇博客实现的二叉搜索树的形状如下,也即是对下面这棵树进行操作。一个是 Node 类,表示某个节点

lfm1010123的博客 553

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构——二叉搜索树Java实现精讲

二叉搜索树实质上是建立在二叉树上,具有搜索功能的数据结构。相比较于数组和链表,二叉搜索树运用了二分查找的算法思想,将对多个数据进行相关操作的时间复杂度控制在 O(log n),提高了对大规模数据进行操作的时间效率。

xuantou的博客 1696

二叉搜索树的实现过程(增、删)

原文链接: https://www.cnblogs.com/yahuian/p/10813614.html 二叉搜索树的增删查 BinarySearchTree.java package Tree; public class BinarySearchTree { //定义节点 class Node { int data;//数据域 Node left;//左子树 Node right;//右子树 public Node.

UP青年 329

【数据结构】Java实现二叉搜索树

详细解析数据结构中的二叉搜索树,并用Java代码实现每一个操作

yican2580的博客 1446

【Java数据结构】二叉搜索树

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树。最优的情况完全二叉树比较次数为logN;最差的就是单支树比较次数为N/2;

2402_84815218的博客 829

数据结构,二叉搜索树的详解

本期讲解:二叉搜索树是怎样形成的,怎样查找二叉搜索树的结点,插入结点以及删除结点。

我的主页 1121

《恋上数据结构第1季》二叉搜索树 BST

Java 实现二叉搜索树二叉搜索树(Binary Search Tree)二叉搜索树接口设计BinarySearchTree 类int size() //元素的数量boolean isEmpty() //是否为空void clear() //清空所有元素void add (E element) //添加元素void remove (E element) //删除元素boolean contains...

萌宅鹿的技术小屋 2775

【数据结构】基于比较的排序算法 - 交换排序

本文介绍交换排序中的冒泡排序与快速排序。冒泡排序通过相邻元素比较交换,实现升序,时间复杂度最坏为O(N²),空间复杂度O(1),稳定且适合小规模有序数据。快速排序采用分治思想,以基准值划分区间,平均时间复杂度O(N log N),空间复杂度O(log N),但不稳定,实际应用中性能优异,可通过随机基准、小区间优化等提升效率。

careathers的博客 331
上一篇: 【Elasticsearch】学习笔记-p2(索引库操作&文档操作)
下一篇: 【LINQ语句】LINQ语句
普通网友
博客等级 码龄3年 8469粉丝 668原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值