BFS和DFS的兩道題?
參考
1. BFS
有一個結構滿足以下形式:
node =
{name:“1”, children:[
{name:“2”, children:[ {name:“4”, children:[ ] }, {name:“5”, children:[ ] } ] },
{name:“3”, children:[ {name:“6”, children:[ ] }, {name:“7”, children:[ ] } ] }
] }
打印結果:
[“1”, “2”, “3”, “4”, “5”, “6”, “7”]
畫個圖,然後用BFS,如果是二叉樹的話就相當於層次遍歷,可以用隊列可以實現。
(function main() {
var node =
{name:"1", children:[
{name:"2", children:[ {name:"4", children:[ ] }, {name:"5", children:[ ] } ] },
{name:"3", children:[ {name:"6", children:[ ] }, {name:"7", children:[ ] } ] }
] };
var queue = []; // 用隊列,因爲要遍歷完一整層
queue.push(node); // 將第一個點入隊
var printArr = [];
while (queue.length !== 0) { // 當隊列空了之後相當於全部結點都遍歷了
var temp = queue.shift(); // 每次都是頭一個元素出隊
printArr.push(temp.name); // 存起來是方便之後輸出結果,不用慢慢調格式
var childs = temp.children;
for (var i = 0; i < childs.length; i++) { // 遍歷它的孩子結點,相當於遍歷一整層
var tmp = childs[i];
queue.push(tmp); // 遍歷了之後入隊
}
}
console.log(printArr); // ["1", "2", "3", "4", "5", "6", "7"]
}());
2. DFS
有一個結構滿足以下形式:
node =
{name:“1”, children:[
{name:“2”, children:[ {name:“4”, children:[ ] }, {name:“5”, children:[ ] } ] },
{name:“3”, children:[ {name:“6”, children:[ ] }, {name:“7”, children:[ ] } ] }
] }
打印結果:
[“1”, “2”, “4”, “5”, “3”, “6”, “7”]
畫個圖,然後用DFS,如果是二叉樹的話,相當於先序遍歷,可以用遞歸實現。
function dfs(node, nodeList) {
if (node) {
nodeList.push(node.name); // 先將點放入list中
var children = node.children; // 獲取node的孩子
for (var i = 0; i < children.length; i++) {
dfs(children[i], nodeList); // 對每個孩子結點都用dfs,找一條最深的路徑
}
}
return nodeList; // 遍歷到最深的時候就是遞歸出口
}
(function main() {
var node =
{name:"1", children:[
{name:"2", children:[ {name:"4", children:[ ] }, {name:"5", children:[ ] } ] },
{name:"3", children:[ {name:"6", children:[ ] }, {name:"7", children:[ ] } ] }
]};
var printArr = dfs(node, []); // 會利用到遞歸來解,因爲要遍歷到最深的路徑才返回
console.log(printArr); // ["1", "2", "4", "5", "3", "6", "7"]
}())