您的位置:

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 < names.length) {
    const name = names[index]
    node = node.children.find(child => child.name === name)
    index++
  }
  return node
}

function findNodeByPathBFS(root, path) {
  return findNodeByBFS(root, node => node.path === path)
}
js树形结构查找节点

2023-05-16
js树形结构样式,js树形组织图

本文目录一览: 1、求大神指点js生成树结构 2、如何使用js实现select下拉框里是树形结构 3、js的树形结构怎么实现 4、如何用js实现select下拉框里是树形结构,可复选,select框中

2023-12-08
php无限树状分类查找字段,php树形结构

2022-11-24
JS递归遍历树结构详解

2023-05-21
Java 树形结构

2023-05-18
java树形结构,java树形结构查询

2023-01-07
js树形递归代码(js递归遍历树)

本文目录一览: 1、JS函数式编程和递归探索:路由树的操作 2、js中平级数组和树形结构数据相互转换 3、JS树结构数据的遍历 4、Vue.js怎样把递归组件构建为树形菜单 JS函数式编程和递归探索:

2023-12-08
数据结构c语言二叉树的查找,数据结构c语言版二叉树代码

2022-11-22
Trie树:一种高效的字符串查找数据结构

2023-05-19
java树形json(Java树形结构筛选查询)

本文目录一览: 1、java如何获取树形格式的json,麻烦提供下思路 2、java 机构树怎么生成json 3、java实现 输入json字符串,返回树形显示 java如何获取树形格式的json,麻

2023-12-08
java数组按树形结构排序,java数组元素排序

2023-01-08
php树形结构查询,mysql树形结构查询

2022-11-21
php递归函数树状列表,php树形结构

2022-11-28
javascript水平树,js 行为树

2022-11-23
数据库的笔记mysql,数据库管理系统笔记

2022-11-24
java树形结构json(java树形结构扁平化实例)

本文目录一览: 1、java 递归数据库生成 树形结构问题 2、java实现树形结构,可以把String[] a = {"1", "1-3-4", "1-2", "1-2"}这个数组,转变成如图的树j

2023-12-08
Java树形结构查询用法

在Java中,树形结构查询主要是通过特定的数据结构和相关算法,来实现对特定的树形结构数据的查询操作,从而获取树中的某个或者某些节点的信息。一、常用的树形数据结构在Java中,常用的树形结构包括二叉树、

2023-12-08
Java树形结构查询用法

在Java中,树形结构查询主要是通过特定的数据结构和相关算法,来实现对特定的树形结构数据的查询操作,从而获取树中的某个或者某些节点的信息。一、常用的树形数据结构在Java中,常用的树形结构包括二叉树、

2023-12-08
Python实现遍历树形结构的方法

2023-05-13
重学java笔记,java笔记总结

2022-11-23