web-dev-qa-db-ja.com

ツリー内のすべてのパスを取得するアルゴリズム

Nレベルのツリーがあります。たとえば、ここには4つのレベルがあります。

enter image description here

各ノードには2つの子があります(最後のノードを除く)。ただし、各行の最初と最後のノードを除く全員に2つの親があります。リストのリストへのすべてのパスを取得するスケーラブルな方法を理解しようとしているので、この例では、文字のリストのリストを作成します。

A,B,D,G

A,B,D,H

A,B,E,H

等.

レベルの数に関係なく、これのためのアルゴリズムを見つける正しい方向に私を導くのを手伝ってくれる人はいますか?

1
Tyress

ノードが2つの親を持つことができるという事実は、標準の 深さ優先検索 の使用を妨げるべきではありません。あなたがそれを説明するように、2人の親を持つ子供はまだ独立して2つの「解決策」の一部です。各ノードを離れる最大2つのエッジがあるという事実は、物事をさらに簡素化します。

search(node):

    if node is null: // maybe a non-terminal parent's left or right was null
        return  // that or someone gave you a null graph

    add node to "discovered" list

    if node is terminal:
        print the list //[A,B,D,G], [A,B,D,H], etc
        remove node from the list
        return // done at this level

    search(node.left)
    search(node.right)
    remove node from the list // all done at this level

左に行く前に右に行くと、発見の順序を変更できます。

4
Scant Roger