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

数据结构-二叉搜索树

二叉搜索树:BST(Binary Search Tree)
二叉搜索树是二叉树,可以为空,如果不为空,满足以下性质:

  • 非空左子树的所有键值小于其根节点的键值
  • 非空右子树的所有键值大于其根节点的键值
  • 左、右字数本身也都是二叉搜索树

二叉搜索树的特点:

  • 二叉搜索树的特点就是相对较小的值总是保存在左节点上,相对较大的值总是保存在右节点上
  • 查找效率非常高

二叉搜索树常见的操作:

  • insert(key, value):向树中插入数据
  • search(key):在树中查找
  • remove(key):从树中移除
  • update(key,value):修改节点数据
  • inOrderTraverse:通过中序遍历方式遍历所有节点
  • preOrderTraverse:通过先序遍历方式遍历所有节点
  • postOrderTraverse:通过后序遍历方式遍历所有节点
  • min:返回树中最小的键/值
  • max:返回树中最大的键/值
class Node {constructor(key) {this._key = key;this._left = null;this._right = null;}
}
class BinarySearchTree {constructor() {this._root = null;}insert(key) {const insertNode = (node, newNode) => {if(newNode._key <= node._key) {if(node._left === null) {node._left = newNode;} else {insertNode(node._left, newNode);}} else {if(node._right === null) {node._right = newNode;} else {insertNode(node._right, newNode);}}}const newNode = new Node(key)if (this._root === null) {this._root = newNode} else {insertNode(this._root, newNode)   }}preOrderTraverse(handler = (value) => {console.log(value)}) {const preOrderTraverseNode = (node) => {if (node === null) {return }handler(node._key)preOrderTraverseNode(node._left)preOrderTraverseNode(node._right)}preOrderTraverseNode(this._root)}midOrderTraverse(handler = (value) => {console.log(value)}) {const midOrderTraverseNode = (node) => {if (node === null) {return }midOrderTraverseNode(node._left)handler(node._key)midOrderTraverseNode(node._right)}midOrderTraverseNode(this._root)}postOrderTraverse(handler = (value) => {console.log(value)}) {const postOrderTraverseNode = (node) => {if (node === null) {return }postOrderTraverseNode(node._left)postOrderTraverseNode(node._right)handler(node._key)}postOrderTraverseNode(this._root)}min() {if (this._root === null) {return null}let node = this._rootwhile(true) {if (node._left === null) {return node._key}node = node._left}}max() {if (this._root === null) {return null}let node = this._rootwhile(true) {if (node._right === null) {return node._key}node = node._right}}search(key) {const searchNode = (node, key) => {if (node === null) {return false}if (node._key === key) {return true}if (key < node._key) {return searchNode(node._left, key)} else {return searchNode(node._right, key)}}return searchNode(this._root, key)}remove(key) {if (this._root === null) {return false}let current = this._rootlet parent = nulllet isLeftChild = truewhile (current._key !== key) {parent = currentif (key < current._key) {isLeftChild = truecurrent = current._left} else {isLeftChild = falsecurrent = current._right}if (current === null) {return false}}// 删除叶子节点if (current._left === null && current._right === null) {if (current === this._root) {this._root = null} else {if (isLeftChild) {parent._left = null} else {parent._right = null}}}// 删除有一个子节点else if (current._left === null ) {if (current === this._root) {this._root = current._right} else if (isLeftChild) {parent._left = current._right} else {parent._right = current._right}} else if (current._right === null) {if (current === this._root) {this._root = current._left} else if (isLeftChild) {parent._left = current._left} else {parent._right = current._left}} else {const getExChangeTargetNode = (current) => {let node = current._rightlet parentNode = currentlet isRightClick = truewhile(true) {if (node._left === null) {if (isRightClick)  {parentNode._right = node._right} else  {parentNode._left = node._right}return node}isRightClick = falseparentNode = nodenode = node._left}}const targetNode = getExChangeTargetNode(current);if (current !== this._root) {if (isLeftChild)  {parent._left = targetNode} else  {parent._right = targetNode}} else {this._root = targetNode}targetNode._right = current._righttargetNode._left = current._left}return true}}

相关文章:

数据结构-二叉搜索树

二叉搜索树&#xff1a;BST(Binary Search Tree) 二叉搜索树是二叉树&#xff0c;可以为空&#xff0c;如果不为空&#xff0c;满足以下性质&#xff1a; 非空左子树的所有键值小于其根节点的键值非空右子树的所有键值大于其根节点的键值左、右字数本身也都是二叉搜索树 二叉…...

JUnit:Java开发者不可或缺的单元测试框架

在软件开发过程中&#xff0c;测试是确保代码质量的关键环节。单元测试作为测试体系的基础&#xff0c;对提升代码质量、降低bug率、增强软件稳定性具有重要作用。JUnit 作为 Java 语言事实上的标准单元测试框架&#xff0c;已经成为 Java 开发者进行单元测试的首选工具。本文将…...

NG32单片机GPIO口配置方式

目录 一、引言 二、GPIO口基本结构 三、GPIO口配置方式 四、工作原理 五、总结 一、引言 NG32单片机是一款集成度高、功能强大的微控制器。其中&#xff0c;GPIO&#xff08;General Purpose Input/Output&#xff09;口作为单片机与外部设备通信的重要接口&#xff0c;具…...

SpringCloud-OpenFeign拓展-连接池、最佳使用方法、日志输出

目录 1 OpenFeign连接池 1.1 常见连接类型 1.2 连接池使用方法 1.2.1 引入依赖 1.2.2 开启连接池功能 1.2.3 配置完成&#xff0c;重启实例即可&#xff0c;底层将更改设置。 2 OpenFeign最佳使用方法 2.1 每个微服务都是单独的project&#xff0c;内部有三个独立模块 …...

跨链协议中Cosmos IBC、Polkadot/XCM、Celer Network的区别以及用途

跨链协议是实现不同区块链之间通信和价值转移的关键技术。Cosmos IBC、Polkadot/XCM 和 Celer Network 是三个在跨链领域内具有代表性的协议&#xff0c;它们各自有着独特的设计理念和应用场景。下面是这三个协议的详细对比&#xff1a; Cosmos IBC (Inter-Blockchain Communi…...

电子画册制作与传统画册相比,有哪些优势?

在当今数字化时代&#xff0c;电子画册作为一种新兴的媒体形式&#xff0c;其制作与传统画册相比具有显著的优势。以下是对这些优势的详细探讨。 首先&#xff0c;电子画册的制作过程通常更加便捷和经济。相较于传统画册需要经历的繁琐的印刷过程&#xff0c;电子画册的制作大多…...

postman如何导入证书

1、打开postman&#xff0c;点击Settings。 2、添加证书。 3、填写要访问平台的URL路径及端口、证书文件、证书密码。 4、添加完之后即可立即调用postman。...

RocketMQ教程(八):RocketMQ的集群搭建

传送门:RocketMQ教程汇总,让你从入门到精通 集群架构 RocketMQ 的各个组件都可以搭建成集群部署,Broker 还可以搭建成主从架构,下面介绍的主要是 Broker 集群。 数据复制策略 复制策略是Broker的Master与Slave间的数据同步方式。分为同步复制与异步复制: 同步复制 消…...

线上观看人次2万+!「飞天技术沙龙-CentOS 迁移替换专场」北京站圆满结束

5 月 29 日&#xff0c;阿里云联合龙蜥社区共同举办的「飞天技术沙龙-CentOS 迁移替换专场」于北京圆满结束&#xff0c;在线观看人次 2 万。本次活动现场汇聚了来自浪潮信息、Intel、龙芯、统信软件、红旗软件、电子五所等多家操作系统产业头部企业和机构&#xff0c;大家围绕…...

Docker基本架构概览-1

Docker基本架构概览 Docker架构 Docker采用客户端-服务器&#xff08;C/S&#xff09;架构&#xff0c;主要组件包括&#xff1a; Docker Client 用户与Docker交互的接口&#xff0c;发送命令到Docker守护进程。 Docker Daemon 运行在后台&#xff0c;接收并处理Docker客户端…...

OZON云仓靠谱吗,OZON云仓垫资提货模式

在电商飞速发展的今天&#xff0c;物流仓储成为了支撑整个电商生态的重要基石。OZON云仓作为市场上新兴的仓储物流服务提供商&#xff0c;凭借其先进的技术和灵活的服务模式&#xff0c;受到了不少电商卖家和消费者的关注。但随之而来的是一系列疑问&#xff1a;OZON云仓靠谱吗…...

数据集笔记:DGraph 大规模动态图数据集

dgraph-web (xinye.com) 1 数据集介绍 DGraph 是一个有向无权的动态图&#xff0c;包含超过 370 万个节点以及 430 万条动态边DGraph 中的节点表示金融借贷用户&#xff0c;有向边表示紧急联系人关系&#xff0c;每个节点包含脱敏后的属性特征&#xff0c;以及表示是否为金融…...

一些常用的git指令总结

1、git add 文件名 &#xff1a;该 命令可将该文件的修改添加到暂存区 比如&#xff1a;我刚刚修改了my_test.cpp文件&#xff0c;这时就可以使用git add my_test.cpp. 就将该修改添加到了暂存区。 2、git commit -m "......说明" 就是将当前的修改记录提交到本地…...

【HarmonyOS】遇见的问题汇总

一、当前编辑的页面&#xff0c;预览打不开 1、问题说明 当前编辑的页面&#xff0c;预览打不开&#xff0c;日志提示如下&#xff1a; Route information is not configured for the current page. To avoid possible redirection issues, configure route information for…...

C# NX二次开发-获取圆弧中心点和半径

使用UF函数可以获取圆弧边或圆弧线中心点和半径: 1.使用 UF_CURVE_ask_arc_data: theUf.Curve.AskArcData(edge.Tag, out UFCurve.Arc arc);theUf.Curve.CreateArc(ref arc, out Tag arc_tag);double[] matrix_values new double[9];double[] vec_product new double[3];theU…...

鸿蒙原生应用元服务开发-位置服务地理编码转化开发

&#xff08;逆&#xff09;地理编码转化开发 场景概述 使用坐标描述一个位置&#xff0c;非常准确&#xff0c;但是并不直观&#xff0c;面向用户表达并不友好。系统向开发者提供了以下两种转化能力。 地理编码转化&#xff1a;将地理描述转化为具体坐标。 逆地理编码转化能力…...

【ArcGISPro SDK】构建多面体要素

结果展示 每个面构建顺序 代码 using ArcGIS.Core.CIM; using ArcGIS.Core.Data; using ArcGIS.Core.Geometry; using ArcGIS.Desktop.Catalog; using ArcGIS.Desktop.Core; using ArcGIS.Desktop.Editing; using ArcGIS.Desktop.Extensions; using ArcGIS.Desktop.Framework;…...

leetcode够用之java语法

常用方法 Arrays.sort()排序 import java.util.Arrays;public class Main {public static void main(String[] args) {int[] numbers {9, 2, 5, 1, 7, 3};Arrays.sort(numbers);System.out.println(Arrays.toString(numbers)); // 输出: [1, 2, 3, 5, 7, 9]} }获取str中的第…...

pdf文件怎么改变大小?在线快速压缩pdf的方法

pdf作为一种常用的文件格式&#xff0c;使用这种文件类型的好处在于不仅拥有更好的兼容性&#xff0c;还可以设置密码来保证安全性&#xff0c;防止未授权用户查看内容&#xff0c;所以现在导出文件展示都会采用这种格式的来做内容展示。当遇到pdf文件过大问题时&#xff0c;想…...

inferCNV:scRNA-seq数据推断染色体拷贝数变化

inferCNV分析简介 inferCNV用于探索肿瘤单细胞RNA-Seq 数据&#xff0c;以确定体细胞大规模染色体拷贝数改变的证据&#xff0c;例如整个染色体或大片段染色体的增益或缺失。这是通过与一组参考“正常”细胞&#xff08;这里的正常细胞可自行定义&#xff09;进行比较&#xf…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...