当前位置: 首页 > news >正文

【数据结构】二叉搜索树

1、什么是二叉搜索树

二叉搜索树又称为二叉排序树,二叉也就说明它跟二叉树一样最多只能有两个度,它可以是棵空树,也可以不是棵空树,当它不是棵空树的时候需要具备以下的性质:

  1. 若它的左树不为空,那么它的左树上的所有结点的值都要小于根节点的值

  1. 若它的右树不为空,那么它的右树上的所有结点的值都要大于根节点的值

  1. 它的左右子树分别也都为二叉搜索树

二叉搜索树其实也是棵二叉树,但是它跟二叉树的不同点也就在上述的三个性质上面

2、模拟实现二叉搜索树

那接下来我们就来模式实现一棵二叉搜索树

首先我们先要创建一个二叉搜索树类,用来模拟实现二叉搜索树:

public class BinarySearchTree {}

那么接下来我们就可以将所有模拟实现的二叉搜索树的属性以及方法全部放入这个 BinarySearchTree 这个类中

二叉搜索树也是树,那么树都是由节点构成的。那么我们就需要创建一个内部类用来构建节点

2.1 内部类

通过内部类来创建节点

//节点
public static class Node {private int key;private Node left;private Node right;public Node(int key) {this.key = key;}
}
  • key:数据域

  • left :左孩子

  • right:右孩子

2.2 属性

private Node root = null;

用来存储根节点

2.3 方法

2.3.1 获取根节点

public Node getRoot() {return root;
}

2.3.2 判空

判断这颗树是否为空树

//判空
public boolean isEmpty(Node root) {if (root == null) {return true;}return false;
}

2.3.3 插入

//插入
public boolean insert(int key) {if (isEmpty(root)) {root = new Node(key);return true;}//查找插入的位置Node cur = root;Node parent = null;while (cur != null) {if (key == cur.key) {return false;} else if (key < cur.key) {parent = cur;cur = cur.left;} else {parent = cur;cur = cur.right;}}Node node = new Node(key);if (key < parent.key) {parent.left = node;} else {parent.right = node;}return true;
}

插入操作就是插入一个节点,首先进入方法判断根节点root是否为空,如果为空直接插入在根节点的位置,然后返回true

如果 root 不为空,就按照查找的逻辑确定插入的位置,进行插入新节点

假设当前的二叉搜索树如下:

现在需要在这颗二叉搜索树上插入 5 这个节点应该如何插入?

答:因为root 不为空,所以就要按照查找的逻辑确定插入的位置。按照二叉搜索树的性质进行比较,循环比较让插入节点的值跟cur节点的值进行比较,如果相等直接返回false,如果小于就让parent指向cur目前所指向的节点,然后再让cur等于cur.left,如果大于就让parent指向cur目前所指向的节点,然后再让cur等于cur.right。当cur为null的时候就跳出循环此时这个位置就是新节点该插入的位置,此时parent就是新节点的父节点。跳出循环判断新节点插入parent节点的右孩子还是左孩子位置,然后插入即可,插入完后后返回true

注:可以根据插入操作构造一棵二叉搜索树

2.3.4 查找

//查找
public Node search(int key) {Node cur = root;while (cur != null) {if (key == cur.key) {return cur;} else if(key < cur.key) {cur = cur.left;} else {cur = cur.right;}}return null;
}

若根节点不为空,就循环比较key的值是否与cur.key的值相等,若相等就找到了,直接返回即可,若不相等就比较key与cur.key的大小关系,如果小于cur就等于cur.left,如果大于 cur 就等于 cur.right,当cur 为空是就跳出循环说明这棵二叉搜索树中没有这个节点

2.3.5 删除节点

//删除
public void remove(int key) {Node cur = root;Node parent = null;while (cur != null) {if (key == cur.key) {removeNode(parent,cur);break;} else if (key < cur.key) {parent = cur;cur = cur.left;} else {parent = cur;cur = cur.right;}}
}public void removeNode(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 target = cur.right;Node targetParent = cur;while (target.left != null) {targetParent = target;target = target.left;}cur.key = target.key;if (target == targetParent.right) {targetParent.right = target.right;} else {targetParent.left = target.right;}}
}

首先得找到要删除得节点,找到之后调用removeNode方法将这个要删除得节点以及它的父节点传过去,在 removeNode 方法中会判断三种情况:

①第一种情况:要删除节点的左节点为空,这一种情况中有可以分为以下几种情况

根节点就是要删除的节点:因为删除的节点的左节点为空,所以直接让根节点等于它的右节点即可

要删除的节点是它父节点的左节点:因为删除的节点的左节点为空,所以直接让父节点的左节点等于要删除节点的右节点

要删除的节点是它父节点的右节点:因为删除的节点的左节点为空,所以直接让父节点的右节点等于要删除节点的右节点

②第二种情况:要删除节点的右节点为空,这一种情况中有可以分为以下几种情况

根节点就是要删除的节点:因为删除的节点的右节点为空,所以直接让根节点等于它的左节点即可

要删除的节点是它父节点的左节点:因为删除的节点的右节点为空,所以直接让父节点的左节点等于要删除节点的左节点

要删除的节点是它父节点的右节点:因为删除的节点的右节点为空,所以直接让父节点的右节点等于要删除节点的左节点

③第三种情况:当要删除的节点左右两边的节点都不为空

2.3.6 打印二叉搜索树

//打印
public void print(Node root) {if (isEmpty(root)) {return;}print(root.left);System.out.println(root.key);print(root.right);
}

打印二叉搜索树其实跟中序打印二叉树是一样的

打印二叉搜索树打印出来的其实是有序的,因为二叉搜索树上述的三个性质

相关文章:

【数据结构】二叉搜索树

1、什么是二叉搜索树二叉搜索树又称为二叉排序树&#xff0c;二叉也就说明它跟二叉树一样最多只能有两个度&#xff0c;它可以是棵空树&#xff0c;也可以不是棵空树&#xff0c;当它不是棵空树的时候需要具备以下的性质&#xff1a;若它的左树不为空&#xff0c;那么它的左树上…...

抢跑数字中国建设,青岛市统计系统考察团赴实在智能调研统计数字员工

当前&#xff0c;数据要素价值不断显现&#xff0c;数字经济正引领着政企业加快数字技术的应用&#xff0c;融通创新工作机制&#xff0c;推进高质量转型。近日&#xff0c;中共中央、国务院印发了《数字中国建设整体布局规划》。《规划》指出&#xff0c;到2025年&#xff0c;…...

深浅拷贝——利用模拟实现basic_string深入理解

深浅拷贝——利用模拟实现basic_string深入理解 一、深浅拷贝的基本概念 深拷贝和浅拷贝都是指在对象复制时&#xff0c;复制对象的内存空间的方式。 1.1 深浅拷贝的不同之处 浅拷贝是指将一个对象的所有成员变量都直接拷贝给另一个对象&#xff0c;包括指针成员变量&#…...

大模型分布式系统

背景&#xff1a;模型越来越大&#xff0c;训练复杂度越来越高&#xff0c;需要训练的时间也是越来越长。那么我们该如何在现有的硬件基础上对模型做训练呢。模型规模的扩大&#xff0c;对硬件&#xff08;算力、内存&#xff09;的发展提出要求。然而&#xff0c;因为 内存墙 …...

【时序】时序预测任务模型选择如何选择?

时间序列是什么时间序列是一种特殊类型的数据集,其中一个或多个变量随着时间的推移被测量。 在时间序列中,观测值是随着时间的推移而测量的。你的数据集中的每个数据点都对应着一个时间点。这意味着你的数据集的不同数据点之间存在着一种关系。这对可以应用于时间序列数据集的…...

重温数据结构与算法之深度优先搜索

文章目录前言一、实现1.1 递归实现1.2 栈实现1.3 两者区别二、LeetCode 实战2.1 二叉树的前序遍历2.2 岛屿数量2.3 统计封闭岛屿的数目2.4 从先序遍历还原二叉树参考前言 深度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;是一种遍历或搜索树或图数据结…...

STM32F103驱动LD3320语音识别模块

STM32F103驱动LD3320语音识别模块LD3320语音识别模块简介模块引脚定义STM32F103ZET6开发板与模块接线测试代码实验结果LD3320语音识别模块简介 基于 LD3320&#xff0c;可以在任何的电子产品中&#xff0c;甚至包括最简单的 51 作为主控芯片的系统中&#xff0c;轻松实现语音识…...

2023 最新可用Google镜像地址 长期更新

Google镜像说明 由于种种原因&#xff0c;国家还未开放Google搜索的使用。虽然可以通过某些技术手段实现访问&#xff0c;但是还是有一些同学需要借助Google搜索镜像才可以达到访问的目的&#xff1b;笔者特意搜集了一些2022年最新的Google搜索镜像供有需求的童鞋使用&#xf…...

MATLAB算法实战应用案例精讲-【优化算法】蝗虫优化算法(GOA)及其算法变种(附matlab和python代码实现)

目录 前言 算法原理 算法思想 GOA 算法的数学模型 迭代模型 算法流程...

数据结构与算法 顺序表、链表总结

文章目录顺序表1、顺序表的基本概念链表1 简介链表概念链表特点链表与数组的对比2 链表的类型分类链表循环单向链表1 简介概念2 数据存储和实现数据存储数据实现3 操作基本操作实现线性表&#xff08;List&#xff09;&#xff1a;零个或多个数据元素的有限序列。在较复杂的线性…...

Nginx集群搭建-三台

1.使用root用户登录Linux服务器 2.创建用户 输入 adduser test 后回车 #test 为创建的用户 3.为创建的用户设置密码 输入 passwd test 后回车 输入两次密码 4.出现 passwd&#xff1a;所有的身份验证令牌已经成功更新。证明Linux新用户和密码创建成功 5.使用新用户test登录Linu…...

【算法】图的存储和遍历

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;或许会很慢&#xff0c;但是不可以停下&#x1f43e; 文章目录1. 图的存储1.1 邻接矩阵1.2 邻接表2. 图的遍历2.1 dfs 遍历2.2 bfs 遍历1. 图的存储 引入 一般来说&#xff0c;树和图有两种存储方式&#…...

文件如何批量复制保存在多个文件夹中

在日常工作中经常需要整理文件&#xff0c;比如像文件或文件夹重命名或文件批量归类&#xff0c;文件批量复制到指定某个或多个文件来中保存备份起来。一般都家最常用方便是手动一个一个去重命名或复制到粘贴到某个文件夹中保存&#xff0c;有没有简单好用的办法呢&#xff0c;…...

16N60-ASEMI高压MOS管16N60

编辑-Z 16N60在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.2Ω&#xff0c;是一款N沟道高压MOS管。16N60的最大脉冲正向电流ISM为48A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。16N60功耗&#xf…...

Open3D 多个点云配准(C++版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 多路配准(多个点云配准)是指在全局空间中对齐多个几何块的过程。输入的数据可以是点云或深度图像 P i P_i P...

java实现Hbase 增删改查

目录 一、新建一个maven工程 二、代码实现 2.1、配置hbase信息&#xff0c;连接hbase数据库 2.2、创建命名空间 2.3、创建表 2.4、删除表&#xff0c;删除之前要设置为禁用状态 2.5、添加数据 2.6、获取命令表空间 / tables列表 2.7、get方法查看表的内容 2.8、scan方法…...

1109. 航班预订统计 差分数组

1109. 航班预订统计 差分数组技巧适⽤于频繁对数组区间进⾏增减的场景 1.由数组a生成差分数组b{b[0]0,i0(或者b[0]a[0],i0)b[i]a[i]−a[i−1],i>01.由数组a生成差分数组b\left\{\begin{array}{l}b[0]0,i0(或者b[0]a[0],i0)\\ b[i]a[i]-a[i-1],i>0\end{array}\right. 1.由…...

图床搭建,使用typora上传

1. 准备gitee作为图床的仓库 新建仓库 准备仓库的私人令牌&#xff0c;后面配合使用 点击个人设置——》私人令牌 注意私人令牌&#xff0c;复制保存好&#xff0c;后面不能再看了 2. 准备PicGO&#xff0c;并进行相关配置 PicGo官方下载链接 下载安装好node.js,下载网址 安…...

低代码开发的优势是什么?

低代码开发的优势是什么?低代码开发这个概念这两年来经常出现在人们的视野中&#xff0c;市场对于低代码的需求也越来越庞大。 Gartner预测&#xff0c;到2025年&#xff0c;75%的大型企业将使用至少四种低代码/无代码开发工具&#xff0c;用于IT应用开发和公民开发计划。 可…...

Ip2Resion线上部署报数据越界及错误处理

上篇在本地测试调用Ip2Resigon解析行政区划 Ip2Region的Java本地实现运行正常&#xff0c;但部署到测试环境&#xff0c;抛出数组越界&#xff08;java.lang.ArrayIndexOutOfBoundsException&#xff09;异常。 环境信息 ip2Resion是2.7版本&#xff0c;对应文件后缀为 xdb。 …...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...