IDをツリーに変換して元に戻すことができるはずです。
ID とビット文字列は次のとおりです。
0 -> 0
1 -> 100
2 -> 11000
3 -> 10100
4 -> 1110000
5 -> 1101000
6 -> 1100100
7 -> 1011000
8 -> 1010100
最初に、ビット文字列が与えられると、ツリーに簡単に移動でき (再帰的な方法)、その逆も可能であるという事実を考慮してください (事前注文、親に 1 を出力し、葉に 0 を出力します)。
主な課題は、ID をビット文字列に、またはその逆にマップしようとすることです。
次のように n ノードのツリーをリストしたとします。
Left sub-tree n-1 nodes, Right sub-tree 0 nodes. (Cn-1*C0 of them)
Left sub-tree n-2 nodes, Right sub-tree 1 node. (Cn-2*C1 of them)
Left sub-tree n-3 nodes, right sub-tree 2 nodes. (Cn-3*C2 of them)
...
...
Left sub-tree 0 nodes, Right sub-tree n-1 nodes. (C0*Cn-1 of them)
Cr = rth catalan number.
あなたが与えた列挙は、次の手順から来ているようです。左のサブツリーを固定し、右のサブツリーを列挙します。次に、次の左のサブツリーに移動し、右のサブツリーを列挙します。最大サイズの左サブツリーから始めて、次は最大サイズ -1 などです。
id = S があるとします。まず、次のような n を見つけます。
C0 + C1 + C2 + ... + Cn < S <= C0+C1+ C2 + ... +Cn+1
その場合、S は n+1 個のノードを持つツリーに対応します。
ここで、P = S - (C0+C1+C2+ ...+Cn) を考えます。これは、n+1 ノードのツリーの列挙における位置です。
ここで、Cn*C0 + Cn-1*C1 + .. + Cn-r Cr < P <= Cn C0 + Cn-1*C1 + .. + Cn-r+1*Cr-1 となるような r を計算します。
これは、左側のサブツリーと右側のサブツリーが持つノードの数を示しています。
P - Cn*C0 + Cn-1*C1 + .. + Cn-r*Cr を考慮すると、正確な左サブツリー列挙位置 (そのサイズのツリーのみを考慮する) と正確な右サブツリー列挙位置を再帰的に計算できます。ビット文字列を形成します。
左側のサブツリーと右側のサブツリーがどのように見えるかを知っているので、ビット文字列を ID にマッピングする方法は似ているはずです。必要なのは、対応する位置を見つけて、ID を取得するための計算を行うことだけです。
ただし、それがどれほど役立つかはわかりません。あなたは常にかなり膨大な数を扱うことになります。