最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript樹結構深度優(yōu)先算法

 更新時間:2022年07月13日 15:30:23   作者:??一碗周?  
這篇文章主要介紹了JavaScript樹結構深度優(yōu)先算法,樹結構可以說是前端中最常見的數(shù)據(jù)結構之一,比如說DOM樹、級聯(lián)選擇、樹形組件,更多相關內(nèi)容需要的小伙伴可以參考一下

什么是樹

在現(xiàn)實生活中,相信每個人對樹都很熟悉,不管是柳樹、楊樹還是桃樹,可以說樹在我們生活中隨處可見;在計算機世界,樹是一種分層結構的抽象模型,

如下圖所示:

樹結構的應用有很多,就比如公司的組織架構,就可以用樹來表示,如下圖:

除了組織架構,像族譜、省市等都可以使用樹結構來表示。

樹的術語

樹有很多的術語,如下圖:

  • :n(n≥0)個節(jié)點所構成的有限集合,當n=0時,稱為空樹;
  • 節(jié)點的度:節(jié)點的子樹個數(shù),例如B節(jié)點的度就是2,A節(jié)點的度就是3;
  • 樹的度:樹的所有節(jié)點中最大的度數(shù),例如上圖中,樹的度是3;
  • 葉子節(jié)點度為0的節(jié)點,也叫葉節(jié)點;
  • 子節(jié)點:如上圖;
  • 兄弟節(jié)點:如上圖;
  • 根節(jié)點:如上圖;
  • 樹的深度:樹中所有結點中的最大層次,例如上圖中樹的深度就是3;
  • 節(jié)點的層次:例如E節(jié)點的層次就是3,節(jié)點的層次就是父節(jié)點層次+1,根節(jié)點的層次為1;
  • 路徑一個節(jié)點到另一個節(jié)點的通道,例如A→H的路徑就是A D H
  • 路徑長度一個節(jié)點到另一個節(jié)點的距離,例如A→H的路徑就是3。

JavaScript中的樹

樹結構可以說是前端中最常見的數(shù)據(jù)結構之一,比如說DOM樹、級聯(lián)選擇、樹形組件等等;

JavaScript中并沒有提供樹這個數(shù)據(jù)結構,但是我們可以通過對象和數(shù)組來模擬一個樹,

例如下面這段代碼:

const tree = {
  value: 'A',
  children: [
    {
      value: 'B',
      children: [
        { value: 'E', children: null },
        { value: 'F', children: null },
      ],
    },
    {
      value: 'C',
      children: [{ value: 'G', children: null }],
    },
    {
      value: 'D',
      children: [
        { value: 'H', children: null },
        { value: 'I', children: null },
      ],
    },
  ],
}

廣度優(yōu)先和深度優(yōu)點遍歷算法

深度優(yōu)先

所謂的深度優(yōu)先遍歷算法,就是盡可能深的去搜索樹的分支,它的遍歷順序如下圖:

實現(xiàn)思路如下:

  • 訪問根節(jié)點;
  • 對根節(jié)點的children持續(xù)進行深度優(yōu)先遍歷(遞歸);

實現(xiàn)代碼如下:

function dfs(root) {
  console.log(root.value)
  root.children && root.children.forEach(dfs) // 與下面一致
  // if (root.children) {
  //   root.children.forEach(child => {
  //     dfs(child)
  //   })
  // }
}
dfs(tree) // 這個tree就是前面定義的那個樹
/* 結果
A
B
E
F
C
G
D
H
I
*/

可以看到,和圖中的順序是一致的,也就是說我們的算法沒有問題。

廣度優(yōu)先

所謂的廣度優(yōu)先就是依次訪問離根節(jié)點近的節(jié)點,它的遍歷順序如下圖:

實現(xiàn)思路如下:

  • 創(chuàng)建要給隊列,把根節(jié)點入隊;
  • 把隊頭出隊并訪問;
  • 把隊頭的children依次入隊;
  • 重復執(zhí)行2、3步,直到隊列為空。

實現(xiàn)代碼如下:

function bfs(root) {
  // 1. 新建隊列 跟節(jié)點入隊
  const q = [root]
  // 4 重復執(zhí)行
  while (q.length > 0) {
    const node = q.shift() // 2 隊頭出隊
    console.log(node.value)
    // 3 隊頭 children 依次入隊
    node.children &&
      node.children.forEach(child => {
        q.push(child)
      })
  }
}
bfs(tree)
/* 結果
A
B
C
D
E
F
G
H
I
*/

可以看到,和圖中的順序是一致的,也就是說我們的算法沒有問題。

到此這篇關于JavaScript樹結構深度優(yōu)先算法的文章就介紹到這了,更多相關JS 樹結構內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

徐汇区| 怀化市| 珲春市| 油尖旺区| 金川县| 五大连池市| 铜鼓县| 宁明县| 沾化县| 连江县| 丹阳市| 霍城县| 嘉善县| 弥渡县| 利川市| 嵊州市| 阜城县| 刚察县| 定远县| 彝良县| 高密市| 嵩明县| 道真| 桂林市| 曲周县| 确山县| 陆良县| 青川县| 堆龙德庆县| 合作市| 周宁县| 平昌县| 嵩明县| 巴中市| 石渠县| 邛崃市| 宕昌县| 永川市| 水城县| 忻城县| 龙海市|