js树形结构查找节点

一、树形结构的定义与遍历

树形结构是一种具有层级关系的数据结构,由节点和边组成,每个节点最多有一个父节点和多个子节点,最上方的节点称为根节点,最下方的节点称为叶子节点。遍历树形结构是指按照一定的规则对所有节点进行访问。树形结构可以用对象或数组实现,其中对象方式会占用较小的内存,但是需要扁平化数据结构后才能进行遍历。


// 以对象方式实现一棵树
const tree = {
  name: 'root',
  children: [
    {
      name: 'child1',
      children: [
        { name: 'grandchild1' },
        { name: 'grandchild2' }
      ]
    },
    { name: 'child2' }
  ]
}

// 扁平化后的数组结构
const flatTree = [
  { name: 'root', parent: null },
  { name: 'child1', parent: 'root' },
  { name: 'grandchild1', parent: 'child1' },
  { name: 'grandchild2', parent: 'child1' },
  { name: 'child2', parent: 'root' }
]

// 遍历树形结构的方法
function traverseTree(node, callback) {
  callback(node)
  if (node.children && node.children.length) {
    node.children.forEach(child => {
      traverseTree(child, callback)
    })
  }
}

二、js查找节点的实现方法

查找树形结构的节点是指在整个树中寻找符合某一条件的节点,这里提供两种实现方法,一种基于深度优先搜索DFS,另一种基于广度优先搜索BFS。深度优先搜索先访问根节点,然后分别访问所有子节点,直到找到满足条件的节点,或访问到叶子节点为止。广度优先搜索按照层次逐层遍历所有节点,直到找到满足条件的节点为止。两种遍历方式都可以使用递归实现,也可以使用栈或队列来实现。

基于深度优先搜索DFS的实现


function findNodeByDFS(root, callback) {
  let result = null
  traverseTree(root, node => {
    if (callback(node)) {
      result = node
    }
  })
  return result
}

基于广度优先搜索BFS的实现


function findNodeByBFS(root, callback) {
  const queue = [root]
  while (queue.length) {
    const node = queue.shift()
    if (callback(node)) {
      return node
    }
    if (node.children && node.children.length) {
      node.children.forEach(child => {
        queue.push(child)
      })
    }
  }
  return null
}

三、根据节点属性查找节点

在树形结构中,每个节点有自己的属性,例如名称、类型、值等,可以根据这些属性来查找符合条件的节点。下面以节点名称为例,给出基于DFS和BFS的两种实现方式。

根据节点名称查找节点


function findNodeByName(root, name) {
  return findNodeByDFS(root, node => node.name === name)
}

function findNodeByNameBFS(root, name) {
  return findNodeByBFS(root, node => node.name === name)
}

四、根据节点路径查找节点

在树形结构中,每个节点可以定义自己的唯一路径,例如文件系统中的绝对路径或者URL地址,可以根据这些路径来查找符合条件的节点。下面以节点路径为例,给出基于DFS和BFS的两种实现方式。

根据节点路径查找节点


function findNodeByPath(root, path) {
  const names = path.split('/')
  let index = 0
  let node = root
  while (node && index  child.name === name)
    index++
  }
  return node
}

function findNodeByPathBFS(root, path) {
  return findNodeByBFS(root, node => node.path === path)
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/199373.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-05 10:21
下一篇 2024-12-05 10:21

相关推荐

  • JS Proxy(array)用法介绍

    JS Proxy(array)可以说是ES6中非常重要的一个特性,它可以代理一个数组,监听数据变化并进行拦截、处理。在实际开发中,使用Proxy(array)可以方便地实现数据的监…

    编程 2025-04-29
  • Vue TS工程结构用法介绍

    在本篇文章中,我们将从多个方面对Vue TS工程结构进行详细的阐述,涵盖文件结构、路由配置、组件间通讯、状态管理等内容,并给出对应的代码示例。 一、文件结构 一个好的文件结构可以极…

    编程 2025-04-29
  • Python程序的三种基本控制结构

    控制结构是编程语言中非常重要的一部分,它们指导着程序如何在不同的情况下执行相应的指令。Python作为一种高级编程语言,也拥有三种基本的控制结构:顺序结构、选择结构和循环结构。 一…

    编程 2025-04-29
  • 解析js base64并转成unit

    本文将从多个方面详细介绍js中如何解析base64编码并转成unit格式。 一、base64编码解析 在JavaScript中解析base64编码可以使用atob()函数,它会将b…

    编程 2025-04-29
  • Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的解决方法

    本文将解决Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的问题。同时,给出一些相关示例代码,以帮助读者更好的理解并处理这个问题。 一、问题解…

    编程 2025-04-29
  • t3.js:一个全能的JavaScript动态文本替换工具

    t3.js是一个非常流行的JavaScript动态文本替换工具,它是一个轻量级库,能够很容易地实现文本内容的递增、递减、替换、切换以及其他各种操作。在本文中,我们将从多个方面探讨t…

    编程 2025-04-28
  • JS图片沿着SVG路径移动实现方法

    本文将为大家详细介绍如何使用JS实现图片沿着SVG路径移动的效果,包括路径制作、路径效果、以及实现代码等内容。 一、路径制作 路径的制作,我们需要使用到SVG,SVG是可缩放矢量图…

    编程 2025-04-27
  • Lidar避障与AI结构光避障哪个更好?

    简单回答:Lidar避障适用于需要高精度避障的场景,而AI结构光避障更适用于需要快速响应的场景。 一、Lidar避障 Lidar,即激光雷达,通过激光束扫描环境获取点云数据,从而实…

    编程 2025-04-27
  • 如何使用JS调用Python脚本

    本文将详细介绍通过JS调用Python脚本的方法,包括使用Node.js、Python shell、child_process等三种方法,以及在Web应用中的应用。 一、使用Nod…

    编程 2025-04-27
  • 相交链表求节点

    相交链表求节点是一个常见的链表问题,涉及到判断两个链表是否相交以及找到相交部分的节点。本文将从链表的常见问题、判定相交链表、求解相交节点三个方面进行详细阐述。 一、链表的常见问题 …

    编程 2025-04-27

发表回复

登录后才能评论