J'essaie de bien apprendre les structures de données et j'ai implémenté le code suivant pour une traversée en profondeur/application d'un rappel sur un arbre normal:
Tree.prototype.traverse = function (callback) {
callback(this.value);
if (!this.children) {
return;
}
for (var i = 0; i < this.children.length; i++) {
var child = this.children[i];
child.traverse(callback);
}
};
Comment pourrais-je changer cela pour qu'il soit d'abord le plus large? Voici à quoi ressemble la classe Tree:
var Tree = function (value) {
var newTree = {};
newTree.value = value;
newTree.children = [];
extend(newTree, treeMethods);
return newTree;
};
Fondamentalement, la différence entre DFS et BFS est qu'avec un DFS vous poussez les enfants du nœud actuel sur une pile, donc ils seront sautés et traités avant tout le reste, tandis que pour BFS vous poussez les enfants à la fin d'une file d'attente, donc ils seront sautés et traités après tout le reste.
DFS est facile à implémenter récursivement car vous pouvez utiliser la pile d'appels comme pile. Vous ne pouvez pas faire cela avec BFS, car vous avez besoin d'une file d'attente. Juste pour clarifier la similitude, convertissons d'abord votre DFS en implémentation itérative:
//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]);
}
}
};
Et maintenant 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]);
}
}
};