首页 > 编程语言 >【无标题】【前端】自学基础算法 -- 16.二叉搜索树

【无标题】【前端】自学基础算法 -- 16.二叉搜索树

时间:2025-01-13 19:00:19浏览次数:3  
标签:arr 16 -- 无标题 二叉 num 搜索 root 节点

二叉搜索树

简介

二叉搜索树是一种二叉树,它满足以下性质:对于树中的任意一个节点,其左子树中的所有节点的值都小于该节点的值,其右子树中的所有节点的值都大于该节点的值。这种数据结构支持高效的搜索操作,例如,在一个二叉搜索树中查找一个特定的值,每次可以根据当前节点的值与目标值的比较结果,决定是在左子树还是右子树中继续搜索。

效率对比

1. 搜索操作效率对比
  • 二叉搜索树: 在平均情况下,二叉搜索树的搜索操作时间复杂度为。这是因为每次比较节点的值后,可以排除树的一半左右(左子树或右子树)。例如,在一个比较平衡的二叉搜索树中,如果树的高度为,且个节点大致均匀分布,那么左右。
  • 暴力循环(线性搜索): 如果是对一个无序的数组进行暴力循环搜索,时间复杂度为。因为在最坏的情况下,需要遍历整个数组才能确定元素是否存在。例如,在一个有个元素的数组中查找一个特定元素,平均需要检查个元素。
2. 插入操作效率对比
  • 二叉搜索树: 平均时间复杂度为。插入新节点时,从根节点开始,根据节点值与当前节点值的比较结果,决定向左子树还是右子树移动,直到找到合适的插入位置。在平衡的二叉搜索树中,插入操作的效率较高。
  • 暴力循环(假设插入到数组中): 如果是将一个元素插入到数组中,在不考虑数组扩容的情况下,平均时间复杂度为。因为可能需要移动插入位置之后的所有元素来为新元素腾出空间。
3. 删除操作效率对比
  • 二叉搜索树: 平均时间复杂度为。删除操作需要考虑多种情况,如删除叶子节点、只有一个子节点的节点和有两个子节点的节点。在平衡的二叉搜索树中,通过适当的调整可以保持树的结构,并且操作效率较高。
  • 暴力循环(假设从数组中删除): 从数组中删除元素,在不考虑元素移动的优化情况下,平均时间复杂度为。因为删除一个元素后,可能需要将后面的元素向前移动来填补空缺。

示例方法

查找一个数,在一个数组/二叉树中是否存在

一、暴力搜索

num 数值普遍较大,循环次数多

let arr = []

for (let i = 0; i < 1000; i++) {
  arr[i] = Math.floor(Math.random() * 1000)
}

let num = 0
function search(arr, target) {
  for (let i = 0; i < arr.length; i++) {
    num += 1
    if (arr[i] === target) return true
  }
  return false
}

console.log(search(arr, 888))
console.log(num)

二、使用二叉搜索树

num2数值普遍较小,循环次数少

class Node {
  constructor(value) {
    this.value = value
    this.left = null
    this.right = null
  }
}

// 辅助函数 - 添加节点
function addNode(root, num) {
  if (root === null) return
  if (root.value === num) return
  if (root.value > num) {
    // 目标值比当前节点小
    if (root.left === null) root.left = new Node(num)
    else addNode(root.left, num)
  } else {
    // 目标值比当前节点大
    if (root.right === null) root.right = new Node(num)
    else addNode(root.right, num)
  }
}

// 辅助函数 - 构建二叉搜索树
function buildSearchTree(arr) {
  if (arr == null || arr.length === 0) return null
  let root = new Node(arr[0])
  for (let i = 1; i < arr.length; i++) {
    addNode(root, arr[i])
  }
  return root
}

let num2 = 0
// 辅助函数 - 使用搜索二叉树查询
function searchByTree(root, target) {
  if (root == null) return false
  num2++
  if (root.value === target) return true
  if (root.value > target) return searchByTree(root.left, target)
  else return searchByTree(root.right, target)
}

let root = buildSearchTree(arr)
console.log(searchByTree(root, 888))
console.log(num2)

标签:arr,16,--,无标题,二叉,num,搜索,root,节点
From: https://blog.csdn.net/qq_34388186/article/details/145115106

相关文章

  • 时间序列预测模型和 随机森林预测模型原理和使用
    让我们一起走向未来......
  • 【事件分析】20250112-Usual 赎回机制调整事件
    背景信息https://docs.usual.money/Usual是一个聚合RWA的稳定币发行协议,经济模型中存在三种代币:USD0:Usual发行的稳定币。USD0++:USD0++是USD0的质押版本,为期4年,可获得USUAL代币奖励。USUAL:Usual协议的治理代币。事发缘由https://usual.money/blog/usual-s-next-......
  • 独立站新手必看:2025年,Wix和WordPress哪个好?
     如今跨境电商独立站依旧有新手入局,大部分人都会在主流选项中选择起步平台,比如Wix和Wordpress就是热门选择。但两个平台哪一个更适合自己?本篇对比可能对你有帮助!一、电商应用Wix和Wordpress并非完完全全仅服务于电商独立站,它们都有博客相关的功能(比如内容的发布、分类、添......
  • 掌握TikTok广告投流,这些技巧你必须知道!
     在TikTok这个充满活力与创意的短视频平台上,每天都有数以亿计的用户在寻找着属于他们的乐趣与灵感。对于许多跨境电商来说,TikTok是一个潜力无限的营销舞台。然而,如何在海量内容中脱颖而出,直击用户痛点,实现精准营销,却是大家面临的难题。今天,我们就来深入探讨TikTok广告投流的关......
  • IPv4与IPv6有什么优缺点?
    IP是指互联网协议,是传输控制协议/互联网协议套件(TCP/IP)的主要部分。TCP/IP是一套标准和规则,用于规范不同网络上的设备之间打包数据(数据报)的传输和交换。互联网协议管理跨网络边界的数据包寻址、打包/解包和路由效率。要参与数据交换,每个内联网或互联网设备都需要一个唯一的......
  • Pinterest营销常见问题:选择Pinterest代理的必要性
    对于跨境外贸人来说,Pinterest作为一个以图像为中心的社交媒体平台,为大家提供了展示创意、吸引潜在客户的独特机会。然而,在运营过程中,大家往往会遇到一系列问题。别担心!本文将来探讨Pinterest营销中常见的问题,以及选择合适代理的必要性,帮助你更有效地利用这一平台促进跨境事业增......
  • Code、RO Data(ReadOnly Data,只读数据)、RW Data(ReadWrite Data,可读写数据)和ZI Data(Zero
    类别定义与功能位置生命期实例Code编译器生成的机器指令ROM区从编译到执行始终存在C语言函数体ROData程序中的只读数据ROM区从编译到执行始终存在const关键字定义的变量RWData初始化为非0值的可读写数据程序存储时位于ROM区,运行时位于RAM区程序存储时位于ROM区,运行时加载到RA......
  • 基于DPDK的用户态协议栈(2)基于DPDK实现UDP的数据接收
    注:本文只实现了数据接收部分一、使用DPDK实现UDP的数据接收流程1.1初始化EALmain(intargc,char*argv[]){//main函数的标准参数,用于接收命令行参数。argc表示参数的数量,argv是一个指向字符串数组的指针,这些字符串是传递给程序的命令行参数。//初始化EAL。if(......
  • 日志分析(溯源、防护)
    全局日志分析,有效促进溯源和防护战法一:态势感知攻击检测 战法目标 在各类安全设备的告警中,误报比例普遍较高,这无疑加大了系统辨别真实攻击并及时响应的难度。通过统一日志平台,可以对关键信息进行快速查询检索,极大提高攻击检测效率。 实现思路 通过日志系统快速统......
  • 何时需要手动刷新授权表
    记忆中在MySQL里对用户进行授权操作后都需要执行flushprivileges才能生效,怎么我在涉及到用户授权相关的文章里没看到执行flushprivileges语句?对于这个问题的解答,首先得明白语句flushprivileges的作用是什么?flushprivileges是flush语句集合里的一条子项,执行......