Ответ 1
В сущности, разница между DFS и BFS заключается в том, что с помощью DFS вы выталкиваете дочерние элементы текущего node в стек, поэтому они будут выгружаться и обрабатываться до всего остального, тогда как для BFS вы нажимаете дочерние элементы на конец очереди, поэтому они будут выгружаться и обрабатываться после всего остального.
DFS легко реализовать рекурсивно, потому что вы можете использовать стек вызовов как стек. Вы не можете сделать это с помощью BFS, потому что вам нужна очередь. Чтобы упростить сходство, давайте сначала конвертируем вашу DFS в итеративную реализацию:
//DFS
Tree.prototype.traverse = function (callback) {
var stack=[this];
var n;
while(stack.length>0) {
n = stack.pop();
callback(n.value);
if (!n.children) {
continue;
}
for (var i = n.children.length-1; i>=0; i--) {
stack.push(n.children[i]);
}
}
};
И теперь BFS
//BFS
Tree.prototype.traverse = function (callback) {
var queue=[this];
var n;
while(queue.length>0) {
n = queue.shift();
callback(n.value);
if (!n.children) {
continue;
}
for (var i = 0; i< n.children.length; i++) {
queue.push(n.children[i]);
}
}
};