4


0

私が覚えていて確認したように、ツリーをトラバースしたりWebの幅を最初にクロール(BFS)する通常の方法はキューを使うことです。 実際にキューを使わずに実装する方法はありますか?

4 Answer


4


私は今この質問が古くなっているのを知っています、しかし私はただ答えたかったです。 これは、配列、リンクリスト(または他の任意の線形コンテナ)を使用して、再帰なしで実行できます。 old`と new`の2つのコンテナーを保持し、 old`の中のすべての項目をトラバースするときには old`を `new`に交換します。 キューを使った実装と非常によく似ています。

Pythonでは、次のようになります。

def breadth_first(root):
    if not root:
        return
    old = []
    new = []
    old.append(root)
    while old:
        for n in old:
            process(n)  # Do something
            if n.left:
                new.append(n.left)
            if n.right:
                new.append(n.right)
        old = new
        new = []

実行時の複雑さは、キュー実装O(n)と同じです。


2


実装が簡単なので、本当にキューを使うべきです。 また、キューを使用すると、複数のマシンを連携させることができます(1つのキューでサイトをキューに入れ、別のキューでサイトをポップして移動します)。

私がそうすることを私が見る唯一の他の方法は再帰を使うことである(はるかに困難であり、そしてほんの少しだけより多くまたはより少ないメモリを使う)。


0


再帰あり しかし、キューはスタックにあります…​


-1


順番を気にする場合は、queueを使用してください。 キューは挿入順を保持します。 あるいは、listの実装、たとえば2つの配列リストを使って交互に実行することもできます。 しかし、基本的に、リストは順番も保持します。

順序を気にしないのであれば、任意のset実装を使用できます。 集合はこの順序を保ちません。

たとえば、BFSの実装では、ノードの順序を気にしないのであれば、キューではなく、古いものと新しいものを交互に使用することができます。