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/zh-hant/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

發表回復

登錄後才能評論