当前位置: 首页 > 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}}
http://www.lryc.cn/news/370458.html

相关文章:

  • JUnit:Java开发者不可或缺的单元测试框架
  • NG32单片机GPIO口配置方式
  • SpringCloud-OpenFeign拓展-连接池、最佳使用方法、日志输出
  • 跨链协议中Cosmos IBC、Polkadot/XCM、Celer Network的区别以及用途
  • 电子画册制作与传统画册相比,有哪些优势?
  • postman如何导入证书
  • RocketMQ教程(八):RocketMQ的集群搭建
  • 线上观看人次2万+!「飞天技术沙龙-CentOS 迁移替换专场」北京站圆满结束
  • Docker基本架构概览-1
  • OZON云仓靠谱吗,OZON云仓垫资提货模式
  • 数据集笔记:DGraph 大规模动态图数据集
  • 一些常用的git指令总结
  • 【HarmonyOS】遇见的问题汇总
  • C# NX二次开发-获取圆弧中心点和半径
  • 鸿蒙原生应用元服务开发-位置服务地理编码转化开发
  • 【ArcGISPro SDK】构建多面体要素
  • leetcode够用之java语法
  • pdf文件怎么改变大小?在线快速压缩pdf的方法
  • inferCNV:scRNA-seq数据推断染色体拷贝数变化
  • 银河麒麟操作系统通过首批软件供应链安全能力认证
  • 【MySQL】数据库介绍|数据库分类|MySQL的基本结构|MySQL初步认识|SQL分类
  • 2024年6月11日 (周二) 叶子游戏新闻
  • JavaSE----类和对象(中)
  • STC8增强型单片机进阶开发--OLED显示器(SPI)
  • 在CSS中,可以使用 float 属性来设置元素浮动
  • wordpress主题开发
  • Elasticsearch 认证模拟题 - 17
  • Swift 中更现代化的调试日志系统趣谈(一)
  • 深入理解Java中的SPI机制
  • 2、python 基础学习总结