私は次のものを持っているとしましょう:
_____W_____
| | |
_T_ _L_ _X_
| | | | | |
A B A B A B
ご覧のとおり、これは標準ツリーです (W
に 3 つの子があることからもわかるように、バイナリ ツリーではありません)。私の目標は、A B
下位レベル全体で子シーケンスが繰り返されているという事実を特定することです。
より一般的に言えば、ツリーのルートから始めて、自分の子供の子サブツリー セット (基本的には孫サブツリー セット) を見て、それらがツリー全体で同一であるかどうかを判断できるようにしたいと考えています。レベル、次に私の子供たちに再帰し、それぞれの小さなスコープで同じことを行います. ツリー全体の一番下まで、すすぎ、繰り返します。
T
私が思いついた単純な解決策は、各サブツリー (この場合は、L
、および)の幅優先 (または深さ優先) トラバーサルを実行し、X
思いついた単語 (最初の文字を引いたもの) を比較することです。 )。この場合の幅優先トラバーサルはTAB
、 、LAB
、およびを生成XAB
し、最初の文字を無視すると、それらがすべて であることがわかりますAB
。しかし、ツリーが代わりに次のようになっていると想像してください。
_____W_____
| | |
_T_ _L_ _X_
| | | | | |
A B Q B A B
A
最初の をつかみ、それから をつかむことができれば、はるかに効率的でありQ
、それらが同じではなく、検索を続けて短絡しても意味がないことに気付くでしょう。
ここで適用できる「明白な」アルゴリズムがあるかどうか、またはおそらく、この特定の問題のために作成されたアルゴリズムがあるかどうかを主に調べています。見たことがない、見つけられない、または検索方法がわからないのいずれかです。
(この質問には「Java」タグを付けました。これは、このツリー構造の実際の実装[および私が適用し、未回答の質問がない他のアルゴリズム]がたまたまその言語であるからです。疑似コードを翻訳できます。 、 同じように。)
編集- 上記の最初のツリーのいくつかの例のステップとして、これはより理にかなっているかもしれません:
W
(ルート) から開始します。- 2 人以上の子供がいますか? この場合、はい、3:
T
,L
,X
. T
、L
、およびX
の子サブツリーを比較します。- 、、およびの子サブツリーのセットは、
T
のスコープのレベル全体で同じですか? この場合、はい、それはずっとです。上記の 2 番目のツリーでは、答えはノーです。L
X
W
A B
Q
W
の子T
、、、、L
にドロップダウンしX
ます。上記の手順を繰り返します。T
子供が2人以上いますか?はい、A
そしてB
。彼らには子供がいますか?上記の例では、いいえ、何もする必要はありません。しかし、 と が子、孫などを含む完全なサブツリーであると想像A
してくださいB
。ここで問題になるのは、これらのサブツリーはのスコープのレベル全体でT
同じですか? ではA son of T
、 の子サブツリーのセットは の子サブツリーのセットと同一B son of T
ですか?