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"]
}())