web-dev-qa-db-fra.com

traversée en largeur d'un arbre en javascript

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;
};
20
devdropper87

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]);
    }
  }
};
44
Matt Timmermans