数据结构:二叉查找树
文章目录
- 二叉查找树
- 一,概述
- 二,添加数据
- 三,删除数据
二叉查找树
一,概述
二叉查找树,也称为二叉搜索树,是一种特殊的二叉树,它或者是一颗空树,或者具有以下性质:对于每个非空节点,其左子树中所有节点的值都小于该节点的值,而右子树中所有节点的值都大于该节点的值。这种特性使得在二叉查找树中查找一个特定的值变得相对简单和高效。
二叉查找树的查找操作如下:
- 从根节点开始查找。
- 如果当前节点为空,说明查找失败,返回NULL。
- 如果当前节点的值等于要查找的值,说明查找成功,返回当前节点。
- 如果要查找的值小于当前节点的值,则在左子树中继续查找。
- 如果要查找的值大于当前节点的值,则在右子树中继续查找。
在二叉查找树中,每个节点的左子树和右子树的高度最多相差1,因此,二叉查找树的查找时间复杂度是O(log n),其中n是树中节点的数量。在最坏的情况下,当树完全不平衡时,可能退化成O(n)的时间复杂度。为了保持二叉查找树的效率,通常会使用一些平衡的策略,如AVL树和红黑树。
总的来说,二叉查找树是一种常见的数据结构,它具有很好的查找性能,但是需要注意平衡的问题,以避免效率的降低。
简介:
- 二叉查找树是一种自我平衡的二叉树,它的中序遍历会得到一个升序的序列。
- 二叉查找树的每个节点都包含一个键和一个值,其中键用于保持树的排序,而值则可以是任何类型的数据。
- 二叉查找树的主要操作包括插入、查找和删除。
图示:
以下是一个简单的二叉查找树的图示:
50/ \30 70/ \ / \10 40 60 80
在这个二叉查找树中,每个节点的键都大于其左子树中所有节点的键,且小于其右子树中所有节点的键。
示例:
以下是一个在Java中实现二叉查找树的简单示例:
public class BinarySearchTree {class Node {int key;Node left, right;public Node(int item) {key = item;left = right = null;}}Node root;BinarySearchTree(int key) {root = new Node(key);}BinarySearchTree() {root = null;}void insert(int key) {root = insertRec(root, key);}Node insertRec(Node root, int key) {if (root == null) {root = new Node(key);return root;}if (key < root.key) {root.left = insertRec(root.left, key);} else if (key > root.key) {root.right = insertRec(root.right, key);}return root;}void inorder() {inorderRec(root);}void inorderRec(Node root) {if (root != null) {inorderRec(root.left);System.out.println(root.key);inorderRec(root.right);}}
}
在这个示例中,定义了一个内部类Node
来表示二叉查找树的节点。每个节点都有一个键key
和两个子节点left
和right
。还定义了两个方法insert
和inorder
。insert
方法用于向二叉查找树中插入一个新的节点,而inorder
方法则用于按中序遍历顺序打印出树中的所有节点的键。
二,添加数据
在Java中,二叉查找树(Binary Search Tree)是一种常见的数据结构。在二叉查找树中,每个节点包含一个关键字和两个指向其子树的链接。树也必须满足二叉查找树性质:左子树上的所有关键字都小于其根节点的关键字,右子树上的所有关键字都大于其根节点的关键字。
下面是一个简单的Java类,表示一个二叉查找树节点:
public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}
然后可以创建一个二叉查找树的类,并实现添加数据的方法:
public class BinarySearchTree {private TreeNode root;public BinarySearchTree() {root = null;}public void add(int value) {root = addRecursive(root, value);}private TreeNode addRecursive(TreeNode current, int value) {if (current == null) {return new TreeNode(value);}if (value < current.val) {current.left = addRecursive(current.left, value);} else if (value > current.val) {current.right = addRecursive(current.right, value);} else {// value already exists in the tree, do nothingreturn current;}return current;}
}
在这个类中,使用了递归方法addRecursive
来找到应该插入新节点的位置。如果树为空,就在根节点插入新值。如果新值小于当前节点的值,将其插入到左子树;如果新值大于当前节点的值,将其插入到右子树。如果新值已经存在于树中,什么也不做。
三,删除数据
在Java中,二叉查找树(Binary Search Tree)是一种常见的数据结构。在二叉查找树中,每个节点包含一个关键字和两个指向其子树的链接。树也必须满足二叉查找树性质:左子树上的所有关键字都小于其根节点的关键字,右子树上的所有关键字都大于其根节点的关键字。
下面是一个简单的Java类,表示一个二叉查找树节点:
public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}
然后可以创建一个二叉查找树的类,并实现删除数据的方法:
public class BinarySearchTree {private TreeNode root;public BinarySearchTree() {root = null;}public void remove(int value) {root = removeRecursive(root, value);}private TreeNode removeRecursive(TreeNode current, int value) {if (current == null) {return null;}if (value == current.val) {// Node with the given value found, remove it from the tree.if (current.left == null && current.right == null) {return null;} else if (current.left == null) {return current.right;} else if (current.right == null) {return current.left;} else {// Find the minimum value in the right subtree and replace it with the current node's value.TreeNode minNode = findMin(current.right);current.val = minNode.val;current.right = removeRecursive(current.right, minNode.val);return current;}} else if (value < current.val) {current.left = removeRecursive(current.left, value);return current;} else {current.right = removeRecursive(current.right, value);return current;}}private TreeNode findMin(TreeNode node) {while (node.left != null) {node = node.left;}return node;}
}
在这个类中,使用了递归方法removeRecursive
来找到应该删除节点的位置。如果要删除的节点没有子节点,直接返回null
。如果要删除的节点只有一个子节点,将这个子节点返回作为新的节点。如果要删除的节点有两个子节点,找到右子树中的最小节点,用它替换要删除的节点,然后在右子树中递归删除这个最小节点。
相关文章:
数据结构:二叉查找树
文章目录 二叉查找树一,概述二,添加数据三,删除数据 二叉查找树 一,概述 二叉查找树,也称为二叉搜索树,是一种特殊的二叉树,它或者是一颗空树,或者具有以下性质:对于每…...
Redis的介绍,安装Redis的方式
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Redis 初识Redis1.1 认识Redis1.2 安装Redis的方式…...
深入理解CI/CD流程:改变你的开发生命周期
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
【React】React入门
目录 一、何为React二、React与传统MVC的关系三、React的特性1、声明式编程①、实现标记地图 2、高效灵活3、组件式开发(Component)①、函数式组件②、类组件(有状态组件)③、一个组件该有的特点 4、单向式响应的数据流 四、虚拟DOM1、传统DOM更新①、举…...
面相面试知识--Lottery项目
面相面试知识–Lottery项目 1.设计模式 为什么需要设计模式? (设计模式是什么?优点有哪些?) 设计模式是一套经过验证的有效的软件开发指导思想/解决方案;提高代码的可重用性和可维护性;提高团…...
《Python趣味工具》——自制emoji2(2)
今天,我们将会完成以下2个内容: 绘制静态emoji总结turtle中常用的绘图函数 文章目录 一、绘制静态emoji::sparkles: 画脸::sparkles:绘制嘴巴::sparkles:绘制眼白:绘制眼白-Part1:绘制眼白—pa…...
【面试刷题】——C++四种类型转化
C支持多种类型转换操作,其中包括四种主要类型转换方式: 隐式类型转换(Implicit Conversion): 隐式类型转换是自动发生的类型转换,由编译器自动完成。 它用于处理不同数据类型之间的运算,例如将…...
集成Activiti-Modeler流程设计器
集成Activiti-Modeler流程设计器 Activiti Modeler 是 Activiti 官方提供的一款在线流程设计的前端插件,可以方便流程设计与开发人员绘制流程图,保存流程模型,部署至流程定义等等。 1、材料准备 首先我们需要获取activiti-explorer.zip&…...
【深度学习】 Python 和 NumPy 系列教程(十一):NumPy详解:3、数组数学(元素、数组、矩阵级别的各种运算)
目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象(ndarray) 多维数组的属性 1、创建数组 2、数组操作 3、数组数学 1. 元素级别 a. 直接运算 b. 加法:np.add()函数 c. 减法:np.subtract()函数 d. 乘法…...
python难题切片处理
边距折叠 Html经常出现的一个外边距折叠,可能有人的不太理解,或者说不知道怎么解决、我们来着重来看下: 当两个div盒子模型连续出现的时候并且同时应用了一个margin外边距,会出现边距重叠的现象: .Div {width:150px; #定义公共的盒子样式 Height:150px; Margin:20p…...
《研发效能(DevOps)工程师(中级)认证》证书查询方式和路径丨IDCF
由国家工业和信息化部教育与考试中心颁发的职业技术证书,也是国内首个《研发效能(DevOps)工程师国家职业技术认证》,IDCF社区作为官方指定培训中心,邀请了多位业界知名专家讲师(部分专家讲师名单:王立杰、杜伟忠、陈老…...
NVR添加rtsp流模拟GB28181视频通道
一、海康、大华监控摄像头和硬盘录像机接入GB28181平台配置 1、海康设备接入配置 通过web登录NVR管理系统,进入网络,高级配置界面,填入GB28181相关参数。 将对应项按刚才获取的配置信息填入即可,下面的视频通道的编码ID可以保持…...
浅谈C++|文件篇
引子: 程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放通过文件可以将数据持久化。C中对文件操作需要包含头文件< fstream > 。 C提供了丰富的文件操作功能,你可以使用标准库中的fstream库来进行文件的读取、写入和定位…...
C++ QT qml 学习之 做个登录界面
最近在学习QT,也初探到qml 做ui 的灵活性与强大,于是手痒痒,做个demo 记录下学习成果 主要内容是如何自己编写一个按钮以及qml多窗口。 参考WX桌面版,做一个登录界面,这里面按钮是写的一个组合控件,有 按…...
LLM 06-大模型架构
LLM 06-大模型架构 6.1 大模型之模型概括 语言模型的一开始就可以被看做是一个黑箱,当前大规模语言模型的能力在于给定一个基于自身需求的prompt就可以生成符合需求的结果。形式可以表达为: p r o m p t ⇝ c o m p l e t i o n prompt \leadsto compl…...
openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据
文章目录 openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据 openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据 在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。 SQL不…...
【k8s】kube-proxy 工作模式
文章目录 Userspace模式:iptables模式:负载均衡(Load Balancing) LB轮询(Round Robin):SessionAffinity:最少连接(Least Connection):IP哈希&…...
Linux:Centos9 《下载-安装》
下载 Download (centos.org)https://www.centos.org/download/ 安装 选择第一个安装centos 根据自己需要的语言环境选择即可 这里选择要安装的磁盘,然后点击完成 这里选择第一个就行带有图形化 然后我们去对这两个进行设置就行 这两个地方自己进行设置就行 耐心等…...
数字化管理平台建设实践
在勘察设计行业,各企业加速推进数字化转型。通过管理要素数字化,不断优化内部组织运营效率;通过生产手段数字化、技术产品数字化,提升服务质量,改善客户体验;通过数字化营销,精准对接市场需求&a…...
Linux命令(80)之sort
linux命令之sort 1.sort介绍 linux命令sort用于将文本文件内容以行为单位加以排序;sort命令默认按每行的第一个字符排序,根据首字母的ASCII码值进行升序(从小到大排列)。 sort的默认分隔符是空白(空格和tab),多少空白都算一个分隔符。 2.…...
[k8s] kubectl port-forward 和kubectl expose的区别
kubectl port-forward 和 kubectl expose 是 Kubernetes 命令行工具 kubectl 提供的两种不同方式来公开服务。 kubectl port-forward kubectl port-forward 命令用于在本地主机和集群内部的 Pod 之间建立一个临时的端口转发通道。 该命令将本地机器上的一个端口绑定到集群内部…...
vscode如何设置文件折叠
随着项目的不断迭代开发,复杂度越来越高,配置文件越来越多,导致vscode左侧文件列表展示非常不直观,幸好可以通过文件折叠来简化展示效果,把同类相关的文件折叠在一块展示,方便查看配置文件。配置好后的效果…...
Linux centos7 bash编程训练
训练编写一段代码,打印输出100之内的明7暗7,同时要求每5个数字打印在一行。 此项训练主要是考察for循环的使用,及条件判断表达式的设置和不同写法的应用。 常用的for循环有四种写法(如打印1-100的整数): …...
k8s集群换ip
1.把/etc/kubernetes/*.conf中所有的旧ip换成新ip cd /etc/kubernetes/ find . -type f | xargs sed -i "s/$oldip/$newip/"2.替换$HOME/.kube/config文件中的旧ip为新ip(注意sudo的话需要改root下的) cd $HOME/.kube/ find . -type f | xargs sed -i "s/$old…...
选择HAL库还是标准库
选择HAL库还是标准库呢?HAL库是趋势,标准库不再升级了,转HAL库是大势所趋。HAL库有优点,也有自身的不足,建议初学者还是从标准库入手。 标准库是单片机开发的基本库,它把“用寄存器实现的功能”写成一个函…...
计算机竞赛 机器视觉的试卷批改系统 - opencv python 视觉识别
文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…...
Mapbox gl HTML经纬度点渲染,动态轨迹播放,自定义图形以及轨迹上显示箭头方向
Mapbox gl HTML经纬度点渲染,动态轨迹播放,自定义图形以及轨迹上显示箭头方向 1. 效果图2. 源码2.1 line.html2.2line_arrow.html 参考 今天要排查个问题,需要显示多个经纬度点连接成线段的方向,于是尝试下展示。 1. mapbox渲染经…...
kubernetes部署(kubeadmin)
文章目录 1.环境准备2. 安装dokcer3.部署cri-docker4.各个节点安装kubeadm等5.整合kubelet和cri-dockerd配置cri-dockerd配置kubelet 6.初始化集群 1.环境准备 环境和软件版本 OS : ubuntu 20.04 container runtime: docker CE 20.10.22 kubernetes 1.24.17 CRI:cr…...
Leetcode168. Excel表列名称
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题解: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 代码如下: class Solution {public String convertToTitle(int columnNumber) {StringBuild…...
碎片笔记 | 大模型攻防简报
前言:与传统的AI攻防(后门攻击、对抗样本、投毒攻击等)不同,如今的大模型攻防涉及以下多个方面的内容: 目录 一、大模型的可信问题1.1 虚假内容生成1.2 隐私泄露 二、大模型的安全问题2.1 模型窃取攻击2.2 数据窃取攻击…...
化妆品网站的建设方案/免费seo营销软件
即使学过机器学习的人,对机器学习中的MLE(极大似然估计)、MAP(最大后验估计)以及贝叶斯估计(Bayesian)仍有可能一知半解。对于一个基础模型,通常都可以从这三个角度去建模,比如对于逻辑回归(Logistics Regression)来说…...
软件网站是怎么做的/seo站内优化站外优化
教程地址 学习完毕,教程很好。...
武鸣住房和城乡规划建设局网站/互联网营销的方法有哪些
人人真是可爱啊,他们的手机客户端软件出现了一个数组下标越界异常: Arry Index Out Of Bounds java/lang/ArrayIndexOutOfBoundsException n 8>8 也即java.lang.ArrayIndexOutOfBoundsException ,在我的手机上出现过两次,一次…...
重庆做网站的/企业网络营销业务
php实现的简单日历代码。例子:复制代码 代码示例:/*** php简单日历* edit: www.jbxue.com*/if(empty($year))$yeardate("Y"); //初始化年份if(empty($month))$monthdate("n"); //初始化月份$wd_ararray("日","一","二…...
做网站好赚钱吗/站长之家网站排名
华为ssh安全连接的配置方法如下:在模拟器ensp中拉一台路由器和云出来。首先将路由器和云路由调通,让我们的电脑外部可以和路由器通信。AR1的基础配置如下:system-view Enter system view, return user view with CtrlZ. [Huawei]sysname AR1[…...
h5响应式网站建设方案/h5页面制作平台
现象:在模拟机中,二级菜单调用不出来 在真机中,二级菜单可以正常显示与使用 测试环境:android模拟机 android sdk 4.4 真机 samsung s4 android 4.2...