昨日の同僚は、文を尋ねた:「どのように私はツリー構造で指定された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: [] } ]