これらの木は同型ですか?


21

前書き

この課題では、与えられた2つのツリーが同型かどうかを判断するプログラムを作成します。ツリーとは、ルートを除くすべてのノードの発信エッジが1つだけである有向非循環グラフを意味します。ノードの名前を変更して一方を他方に変換できる場合、2つのツリーは同形です。たとえば、2つのツリー(すべてのエッジが上を向いている)

  0       0
 /|\     /|\
1 3 4   1 2 5
|\       /|
2 5     3 4

簡単に同型であることがわかります。

L次の方法で、ツリーを非負整数のリストとしてエンコードします。ツリーのルートにはラベルがあり0、ノードもあり1,2,...,length(L)ます。各ノードにi > 0は、L[i](1ベースのインデックス付けを使用して)発信エッジがあります。たとえば、リスト(要素の下にインデックスが指定されている)

[0,0,1,3,2,2,5,0]
 1 2 3 4 5 6 7 8

ツリーをエンコードします

  0
 /|\
1 2 8
| |\
3 5 6
| |
4 7

入力

入力は、ネイティブ形式または言語で指定された2つの非負整数のリストです。上記で指定した方法で2つのツリーをエンコードします。それらについて、次の条件を想定できます。

  1. 空ではありません。
  2. それらは同じ長さです。
  3. 各リストLL[i] < i、すべての(1ベースの)インデックスを満たしますi

出力

木が同型の場合、出力は真の値になり、そうでない場合は偽の値になります。

ルールとスコアリング

完全なプログラムまたは関数のいずれかを作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。時間制限はありませんが、ツリーまたはグラフの同型を決定するビルトインは許可されていません。

テストケース

真実のインスタンス

[0] [0]
[0,1,2,1] [0,1,1,3]
[0,1,1,3,3] [0,1,2,2,1]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,4,2,1]
[0,1,2,3,1,2,3,0,8] [0,1,0,3,3,4,4,7,7]

偽のインスタンス

[0,0] [0,1]
[0,1,2,0,3,3,4] [0,1,2,3,0,4,3]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,5,2,1]
[0,1,1,0,1,3,2,1,5] [0,1,0,3,3,3,2,5,2]
[0,1,2,3,1,2,3,0,8] [0,1,0,1,4,4,5,6,6]
[0,1,0,2,0,3,0,4,0,5] [0,0,2,1,0,3,4,0,0,9]


@DigitalTrauma Dangit、OPにビルトインを許可しませんでした... 60バイトのMmaソリューションがありました
...-LegionMammal978

回答:


2

Mathematica、48バイト

SameQ@@(Sort//@(0(0//.PositionIndex@#))&/@{##})&

それを使用するソリューションよりもさらに短いですIsomorphicGraphQ

IsomorphicGraphQ@@(Graph@*MapIndexed[#->Tr@#2&]/@{##})&

6

Python、83

2行目の匿名関数が私の解決策です。

f=lambda l,i=0:sorted(f(l,j+1)for j,e in enumerate(l)if e==i)
lambda a,b:f(a)==f(b)

f正規化された子のソート済みリストであるサブツリーの正規化された形式を返します。次に、各ツリーの正規化された形式が等しいかどうかを確認する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.