私は、一般的なケース(一般的ではないケースでさえ)を解決するのは難しいというヨアヒム・イサクソンの答えに同意します。しかし、私は、指定された開始要素を持つ分子ツリーグラフの比較的狭いケースを解決するための戦略を提案したいと思います。[これは、私がこの回答に取り組んでいる間に投稿されたPeterdeRivazの回答に相当することに注意してください。]
まず、そのグラフに固有の分子グラフを記述するためのフォームまたは言語を定義しましょう。グラフで形成できる文字列は1つだけです。これにより、2つの文字列を比較して、2つのグラフが同じであるかどうかを判断できるため、問題を軽減して、比較する2つの正しい文字列を作成できます。(このアプローチには、完全なグラフ比較アルゴリズムよりも視覚的にデバッグしやすいという利点もあります。)私は通常、H2OやH2SO 4のような形で記述された分子を目にしますが、このアプローチはグラフィネスを維持しません。分子の数が多いため、比較には使用できません(H 2Oは水またはその要素の他の非常に奇妙な配置である可能性があります)。それでは、Lispのようなものを使用して、次のルールに従って分子を記述しましょう。
- 各グラフ(サブグラフを含む)はで始まり、
(
で終わります)
- 子を持つノードAは、新しいグラフにリストされる最初のノードであり、このグラフは、特定の順序で親グラフにリストされます(後で決定されます)。
- 子を持たないノードAは、その親グラフに特定の順序でリストされます(後で決定されます)。
これらの開始ルールを使用して、H2Oをよりグラフのような用語で説明できるようになりました。
O
はグラフのルートであるため、新しいグラフが開始されます。(O)
H
はの最初の子ですがO
、子がないため、サブグラフの先頭としてではなく、そのまま親にリストされます。(OH)
H
はの2番目の子ですがO
、には子がないため、サブグラフの先頭としてではなく、そのまま親にリストされます。(OHH)
それで

になり(OHH)
ます。
この場合の順序は重要ではありません。2つH
のは子供がなく、要素的に同等だからです。
このアプローチをテストするために、奇妙で不合理な形のH2Oを試してみましょう。

O
はグラフのルートであるため、新しいグラフが開始されます。(O)
H
の最初の子ですO
。子があるため、新しいグラフが開始されます。(O(H))
H
はの最初の子ですがH
、には子がないため、サブグラフの先頭としてではなく、そのまま親にリストされます。(O(HH))
これまでのアプローチでは、順序付けが問題にならないH 2 Oのような単純なケースを処理できることはわかっていますが、H 2 SO 4O
は、から外れる要素を一貫して順序付けしないと機能しませんS
。サブグラフ(サブグラフがある場合)が計算されるまで、子に意味のある順序を与えることはできないため、実行する最終ルールを追加します。
- 各グラフ(サブグラフを含む)はで始まり、
(
で終わります)
- 子を持つノードAは、新しいグラフにリストされる最初のノードであり、このグラフは特定の順序で親グラフにリストされます(ステップ4を参照)。
- 子を持たないノードAは、その親グラフに特定の順序でリストされます(ステップ4を参照)。
- すべての子ノードにアクセスし、それらのサブグラフ(存在する場合)を作成したら、親ノードの子ノード/子サブグラフをアルファベット順に並べます
この新しいルールを使用してH2Oを再検討すると、 2H
つのがアルファベット順に同等であり、子がないため、同じ出力が生成されます。では、H 2SO4を試してみましょう。

S
はグラフのルートであるため、新しいグラフが開始されます。(S)
O
の最初の子ですS
。子があるため、新しいグラフが開始されます。(S[unsorted:](O))
「H」はの最初の子ですO
。子供はいません。処理する子は他にないため、このレベルでの並べ替えは必要ありません。(S[unsorted:](OH))
O
の2番目の子ですS
。これには子供がいません:(S[unsorted:](OH)O)
O
の3番目の子ですS
。子があるため、新しいグラフが開始されます。(S[unsorted:](OH)O(O))
「H」はの最初の子ですO
。子供はいません。処理する子は他にないため、このレベルでの並べ替えは必要ありません。(S[unsorted:](OH)O(OH))
O
の4番目の子ですS
。これには子供がいません:(S[unsorted:](OH)O(OH)O)
- 最後に、の子を
S
アルファベット順に並べ替えます(S(OH)(OH)OO)
(アルファベット順の比較では、サブグラフに特別な扱いをしていることに注意してください。ただし、これは必須ではありません)。
最終結果は(S(OH)(OH)OO)
H 2 SO 4のバリエーションを試して、何が生成されるかを見てみましょう。これはアプローチが優れていることを証明するものではなく、グラフの変化がどのように異なる結果を生み出すかを示すだけであることに注意してください。

S
はグラフのルートであるため、新しいグラフが開始されます。(S)
O
の最初の子ですS
。子があるため、新しいグラフが開始されます。(S[unsorted:](O))
O
最初の子供です。子供はいません。(S[unsorted:](O[unsorted:]O))
H
は2番目の子で、子はありません。(S[unsorted:](O[unsorted:]OH))
- 次に、の子を並べ替えます
O
。(S[unsorted:](OHO)
O
の2番目の子ですS
。子があるため、新しいグラフが開始されます。(S[unsorted:](O))
H
最初の子供です。子供はいません。(S[unsorted:](OHO)(O[unsorted:]H))
O
は2番目の子で、子はありません。(S[unsorted:](OHO)(O[unsorted:]HO))
- 次に、の子を並べ替えます
O
。(S[unsorted:](OHO)(OHO))
- 最後に、の子を
S
アルファベット順に並べ替えます。(S(OHO)(OHO))
このH2SO 4()は前のもの()とは異なります。(S(OHO)(OHO))
(S(OH)(OH)OO)
私は、このアプローチが機能することが保証されていることを正式に証明したり、正式に説明したり、結合数などの幅広い分子の特徴を説明したりすることはしませんでした。ただし、少なくとも、グラフ比較の問題を解決してみることをお勧めします。私はそれが実行可能だと思います。