Java数据结构-二叉搜索树

目录

  • 1. 概念
  • 2. 二叉搜索树的操作
    • 2.1 查找
    • 2.2 插入
    • 2.3 删除
  • 3. 全部代码

1. 概念

二叉搜索树是特殊的二叉树,也叫二叉排序树,它的特点是:每个结点的左子树上的所有结点的值都小于这个结点的值,右子树上的所有结点的值都大于这个结点的值,另外所有的左子树和右子树也分别为二叉搜索树,如图:
在这里插入图片描述

2. 二叉搜索树的操作

2.1 查找

根据二叉搜索树的性质来,很容易可以理解查找的逻辑:从根结点开始,比较结点的值与待查找的值,如果待查找的值比根结点的值小,说明待查找的结点一定在树的左边,如图
在这里插入图片描述
当然也有其他情况:根结点为空、该树不存在要查找的这个结点,这个时候直接返回null就可以了

public TreeNode search(int key) {TreeNode cur = root;while (cur != null) {if (cur.val > key) {cur = cur.left;} else if (cur.val < key) {cur = cur.right;} else {return cur;}}return null;
}

2.2 插入

插入的前提:插入一定是在叶子结点上插入,因为插入之后也要满足二叉搜索树的性质,插入之前需要查找要插入的位置,而查找的逻辑和刚才的逻辑一样
在这里插入图片描述

2.3 删除

删除的情况比较复杂,主要分为以下情况(假设del为要删除的结点,parent为del的父亲结点):

1、cur.left == null

  • 1、del 是root
  • 2、del 不是root,del是parent.left
  • 3、del 不是root,del是parent.right

2、cur.right == null

  • 1、del 是root
  • 2、del 不是root,del是parent.left
  • 3、del 不是root,del是parent.right

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

下面我们一个一个分析
情况1:del.left==null

  • 情况1.1:del是根结点root,删除逻辑:root =del.right
    在这里插入图片描述

  • 情况1.2 :del不是根结点,del是parent.left删除逻辑:parent.left=del.right
    在这里插入图片描述

  • 情况1.3:del不是根结点,del是parent.right,删除逻辑:parent.right=del.right
    在这里插入图片描述
    情况2:del.right==null

  • 情况2.1:del是根结点root,删除逻辑root = del.left
    在这里插入图片描述

  • 情况2.2:del不是根结点,del是parent.left,删除逻辑:parent.left = del.left
    在这里插入图片描述

  • 情况2.3:del不是根结点,del是parent.right,删除逻辑:parent.right = del.left
    在这里插入图片描述
    情况3:要删除的结点左右都不为空
    如图
    在这里插入图片描述

两种方法:
1.找到del的左树找值最大的结点,将del结点的值替换成这个值,接着删除这个最大值的结点,如上图的37,删除之后的情况如下
在这里插入图片描述

2.找到del的右子树找值最小的结点,将del结点的值替换成这个值,接着删除这个最小值的结点,如上图的45,删除之后的结果如下
在这里插入图片描述

3. 全部代码

public class BinarySearchTree {static class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int val) {this.val = val;}}public TreeNode root;/*** 查找** @return*/public TreeNode find(int key) {TreeNode cur = root;while (cur != null) {if (cur.val > key) {cur = cur.left;} else if (cur.val < key) {cur = cur.right;} else {return cur;}}return null;}//插入public void insert(int key) {TreeNode cur = root;TreeNode parent = null;TreeNode newNode = new TreeNode(key);if (cur == null) {root = newNode;return;}while (cur != null) {if (cur.val > key) {parent = cur;cur = cur.left;} else if (cur.val < key) {parent = cur;cur = cur.right;} else {return;}}if (parent.val > key) {parent.left = newNode;} else {parent.right = newNode;}}//删除public void delete(int key) {TreeNode cur = root;TreeNode parent = null;while (cur != null) {if (key > cur.val) {parent = cur;cur = cur.right;} else if (key < cur.val) {parent = cur;cur = cur.left;} else {//删除结点remove(parent, cur);return;}}}// 分情况讨论private void remove(TreeNode parent, TreeNode del) {//情况1:del.left==nullif (del.left == null) {//情况1.1 del是rootif (del == root) {root = del.right;} else {if (del == parent.left) {//情况1.2 del不是root,del是parent.leftparent.left = del.right;} else if (del == parent.right) {//情况1.3 del不是root,del是parent.rightparent.right = del.right;}}} else if (del.right == null) {//情况2:del.right==nullif (del == root) {//情况2.1 del是rootroot = del.left;} else {if (del == parent.left) {//情况2.2 del是parent.leftparent.left = del.left;} else if (del == parent.right) {//情况2.3 del是parent.rightparent.right = del.left;}}} else {//情况3 del.left和del.right都不为空//将del右树的值最小的结点或者左树的值最大的结点和del替换//右边找TreeNode target = del.right;TreeNode targetP = del;while (target.left != null) {targetP = target;target = target.left;}//删除之前先交换del.val = target.val;//分情况删除if (target == targetP.right) {targetP.right = target.right;}if (target == targetP.left) {targetP.left = target.right;}}}
}

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

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

相关文章

详解 Spark 编程之 RDD 依赖关系

一、依赖与血缘关系 依赖&#xff1a;两个相邻 RDD 之间的关系血缘关系&#xff1a;多个连续的 RDD 的依赖由于 RDD 不会保存数据&#xff0c;为了提高容错性&#xff0c;每个 RDD 都会保存自己的血缘关系&#xff0c;一旦某个转换过程出现错误&#xff0c;可以根据血缘关系重新…

JavaScript实现粒子数字倒计时效果附完整注释

<!DOCTYPE html> <html lang="en"><head><meta charset

随身wifi网络卡顿怎么解决?随身WiFi哪个牌子的最好用?排名第一名的随身WiFi!

对于随身wifi靠不靠谱这个问题&#xff0c;网上一直存在争议。很多人的随身wifi网速不稳定&#xff0c;信号看着满格就是上不了网。关于随身wifi卡顿到底该怎么解决呢&#xff1f; 1.如果是设备网络在一个地方上网速度很快&#xff0c;换一个地方网络就不行了&#xff0c;很可能…

股票买卖II

股票买卖II 时间限制&#xff1a;1秒 内存限制&#xff1a;128M 题目描述 给定一个长度为N的数组&#xff0c;数组中的第i个数字表示一个给定股票在第i天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票…

解析Java中1000个常用类:Readable类,你学会了吗?

在 Java 编程中,处理输入流是一个常见的需求。Java 提供了多种方式来处理输入流,例如 InputStream、Reader 等类和接口。 而 Readable 接口是 Java 提供的一个简单而强大的接口,用于表示可读的字符序列。 本文将详细介绍 Readable 接口的用途、实现原理、应用场景,并通过…

Linux学习笔记(清晰且清爽)

本文首次发布于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#xff0c;请访问本篇笔记 Linux安装 关于安装这里就不过多介绍了&#xff0c;安装版本是CentOS 7&#xff0c;详情安装步骤见下述博客在VMware中安装CentOS7&#xff08;超详细的图文教…

QT之全局忽略编译警告QMAKE_CXXFLAGS

全局忽略编译警告QMAKE_CXXFLAGS 这个是Qt中用来给编译器传递开关的&#xff0c;常写在’pro’文件或’pri’文件中。 将所有的警告当成错误处理 QMAKE_CXXFLAGS -Werror return-type //函数有返回值 QMAKE_CXXFLAGS -Werror return-local-addr //返回局部变量地址 QMAKE…

Dubbo架构概览:服务注册与发现、远程调用、监控与管理

Dubbo 是一个成熟的、高性能的、基于 Java 的微服务开发框架&#xff0c;它主要用于解决分布式系统中的服务治理问题&#xff0c;包括服务的注册与发现、远程过程调用&#xff08;RPC&#xff09;、服务监控与管理等多个关键环节。以下是Dubbo架构概览的详细介绍&#xff1a; …

3种使用OpenCV进行图像合成的技巧

准备好探索图像世界的魔法了吗&#xff1f;今天&#xff0c;我们将用Python和OpenCV库&#xff0c;一起解锁三种超炫的图像合成技巧&#xff0c;让你的照片变得与众不同&#xff01;&#x1f308; 1. 图像融合&#xff1a;让风景与梦境交织 想象一下&#xff0c;把日出的辉煌…

【前端每日基础】day33——响应式布局

响应式布局是一种网页设计的方法&#xff0c;它可以使网站在不同的设备上&#xff08;如桌面电脑、平板电脑、手机等&#xff09;以及不同的屏幕尺寸上呈现出最佳的显示效果。响应式布局的目标是使用户在任何设备上都能够方便地访问和浏览网站&#xff0c;而不需要使用不同版本…

ios v品会 api-sign算法

vip品会 api-sign算法还原 ios入门案例 视频系列 IOS逆向合集-前言哔哩哔哩bilibili 一、ios难度与安卓对比 这里直接复制 杨如画大佬的文章的内容&#xff1a; ios难度与安卓对比 很多人说ios逆向比安卓简单&#xff0c;有以下几个原因 1 首先就是闭源&#xff0c;安卓开源…

PH编程入门:从基础到实践的全方位解析

PH编程入门&#xff1a;从基础到实践的全方位解析 PH编程&#xff0c;作为一种独特而强大的编程语言&#xff0c;正逐渐在各个领域展现其巨大的潜力。对于初学者来说&#xff0c;如何快速入门并掌握PH编程的精髓&#xff0c;是一个既充满挑战又充满机遇的过程。本文将从四个方…

vscode过滤器@modified(查看配置了哪些设置)

文档 visualstudio•docs•getstarted•settingshttps://code.visualstudio.com/docs/getstarted/settings 说明 使用modified可以过滤出&#xff1a; 配置过的设置&#xff08;和默认值不同&#xff09;&#xff1b; 在 settings.json 文件中配置了值的设置 步骤 1.打开…

Ubuntu Linux 24.04 使用certbot生成ssl证书

设置域名 1. 将需要生成SSL证书的域名解析到IP地址 idealand.xyz <> 64.176.82.190 检查防火墙的设置 1. 首先查看防火墙的状态&#xff1a; # ufw status 2. 如果防火墙开启了&#xff0c;要开放80和443端口用于certbot验证 # ufw allow 80 # ufw allow 443 生…

Vue3实战笔记(53)—奇怪+1,VUE3实战模拟股票大盘工作台

文章目录 前言一、实战模拟股票大盘工作台二、使用步骤总结 前言 实战模拟股票大盘工作台 一、实战模拟股票大盘工作台 接上文&#xff0c;这两天封装好的组件直接应用,上源码&#xff1a; <template><div class"smart_house pb-5"><v-row ><…

JS对象由浅入深

对象 对象&#xff08;Object&#xff09;&#xff1a;JavaScript里的一种数据类型&#xff08;引用类型&#xff09;&#xff0c;也是用于存储数据的 好处&#xff1a;可以用来详细的描述某个事物&#xff0c;是用键值对形式存储语义更明了 特点&#xff1a;对象数据是无序的&…

模型 FABE(特性 优势 好处 证据)法则

说明&#xff1a;系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。特性、优势、好处、证据&#xff0c;一气呵成。 1 FABE法则的应用 1.1 FABE法则营销商用跑步机 一家高端健身器材公司的销售代表正在向一家新开的健身房推销他们的商用跑步机。以下…

数控切割编程:探索精密制造的奥秘与挑战

数控切割编程&#xff1a;探索精密制造的奥秘与挑战 在现代化制造领域&#xff0c;数控切割编程以其高精度、高效率的特性&#xff0c;成为众多行业不可或缺的工艺手段。然而&#xff0c;对于初学者或外行人来说&#xff0c;数控切割编程往往显得神秘且复杂。本文将从四个方面…

【数据分享】中国电力年鉴(2004-2022)

大家好&#xff01;今天我要向大家介绍一份重要的中国电力统计数据资源——《中国电力年鉴》。这份年鉴涵盖了从2004年到2022年中国电力统计全面数据&#xff0c;并提供限时免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 自1993年首次出版以来&#xf…

【数据结构】链表与顺序表的比较

不同点&#xff1a; 顺序表和链表是两种常见的数据结构&#xff0c;他们的不同点在于存储方式和插入、删除操作、随机访问、cpu缓存利用率等方面。 一、存储方式不同: 顺序表&#xff1a; 顺序表的存储方式是顺序存储&#xff0c;在内存中申请一块连续的空间&#xff0c;通…