web-dev-qa-db-ja.com

javascriptでのツリーの幅優先走査

私はデータ構造をよく学び、通常のツリーでコールバックの深さ優先のトラバーサル/アプリケーションのために次のコードを実装しようとしています:

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);
  }
};

代わりにこれをどのように変更して最初に幅を広げることができますか? Treeクラスは次のようになります。

var Tree = function (value) {
  var newTree = {};

  newTree.value = value;
  newTree.children = [];
  extend(newTree, treeMethods);

  return newTree;
};
20
devdropper87

基本的に、DFSとBFSの違いは、DFSを使用すると、現在のノードの子をスタックにプッシュするため、ポップされて処理されることですbeforeその他、BFSの場合は子をプッシュしますキューの最後に追加されるため、ポップされて処理されますafterその他すべて。

呼び出しスタックをスタックとして使用できるため、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]);
    }
  }
};
44
Matt Timmermans