DFSとBFS:木を探します

昨日の同僚は、文を尋ねた:「どのように私はツリー構造で指定されたIDに基づいて、子のすべてを見つけるのですか?」

CURDのために私の中で、通常は常にあります、まだ面白いのですが、私が対処する必要がある部門の構造であり、

var arr = [
  {v: 1,child : [
    {v: 2,child : [
      {v: 3,child : [
        {v: 4,child : [
          {v: 5,child : [
            {v: 6,child : []},
          ]},
        ]},
      ]},{v: 7,child : [
        {v: 8,child : [
          {v: 9,child : [
            {v: 10,child : []},
          ]},
        ]},
      ]},
      {v:11,child : [
        {v: 12,child : [
          {v: 13,child : [
            {v: 14,child : [
              {v: 15,child : []},
            ]},
          ]},
        ]},
        {v: 16,child : [
          {v: 17,child : [
            {v: 18,child : []},
          ]},
        ]},
      ]},
      {v: 19,child : [
        {v: 20,child : []},
      ]},
    ]},
  ]},
]

一般的な深さとノードの子ノードの数は、明確な構造ではないです。

深さ優先探索(DFS)と幅優先トラバーサル(BFS)

このツリーは二つのプログラムを持って検索深度优先し、广度优先

深さ優先探索:あなたがこれまでのリーフノードを見つけるまで左部分木の長手方向に沿って横断する、ルートノードから始まります。日付までのすべてのノードを通過するまで、次に右部分木のノードを横断する、前のノードに戻ります。

幅優先トラバーサル:層ノードツリーに基づいて、縦、横トラバースセグメントの階層ツリーを横断する、ルートから始まります。

その後、機能を実現

/**
 * 深度优先查找
 * @param {Array} array 要遍历的结构 
 * @param {Number} id 要寻找的
 * @param {String} str 记录路径,如果你不需要可以去掉
 */
function getchild_dfs(array,id,str){
  console.log(str);
  for (let i = 0; i < array.length; i++) {
    str += '->' + array[i]['v']; 
    if (array[i]['v'] === id) {
      return array[i].child; 
    }else{
      var res = getchild_dfs(array[i].child,id,str);
      if (res) {
        return res;
      }
    }
  }
  
}
/**
 * 广度优先
 * @param {Array} array 要遍历的结构 
 * @param {Number} id 要寻找的
 * @param {String} str 记录路径,如果你不需要可以去掉
 */
function getchild_bfs(array,id,str){
  
  var childs = [];
  console.log(str);
  for (let i = 0; i < array.length; i++) {
    str += '->' + array[i]['v']; 
    if (array[i]['v'] === id) {
      return array[i].child; 
    }else{
      childs = childs.concat(array[i].child);
    }
  }
 
  return getchild_bfs(childs,id,str);
}

const str = '0';
console.log('-------深度优先----------');
console.info(getchild_dfs(arr,17,str));
console.log('--------广度优先---------');
console.info(getchild_bfs(arr,17,str));

結果を印刷します:

-------深度优先----------
0
0->1
0->1->2
0->1->2->3
0->1->2->3->4
0->1->2->3->4->5
0->1->2->3->4->5->6
0->1->2->3->7
0->1->2->3->7->8
0->1->2->3->7->8->9
0->1->2->3->7->8->9->10
0->1->2->3->7->11
0->1->2->3->7->11->12
0->1->2->3->7->11->12->13
0->1->2->3->7->11->12->13->14
0->1->2->3->7->11->12->13->14->15
0->1->2->3->7->11->12->16
[ { v: 18, child: [] } ]
--------广度优先---------
0
0->1
0->1->2
0->1->2->3->7->11->19
0->1->2->3->7->11->19->4->8->12->16->20
[ { v: 18, child: [] } ]

おすすめ

転載: www.cnblogs.com/Molyp/p/12069145.html