二分木の可能なすべての順列を生成するためのアルゴリズムを見つける必要があり、リストを使用せずにそれを行う必要があります(これは、ツリー自体がリストに変換できないセマンティクスと制約を持っているためです)。高さが3以下の木で機能するアルゴリズムを見つけましたが、高さが高くなると、追加された高さごとに1セットの可能な順列が失われます。
各ノードは元の状態に関する情報を保持しているため、1つのノードは、そのノードに対してすべての可能な順列が試行されたかどうかを判断できます。また、ノードは天気に関する情報を保持しているか、「スワップ」されているかどうか、つまり、サブツリーのすべての可能な順列を確認したかどうかを確認します。ツリーは左中央にあります。つまり、右側のノードは常にリーフノードである必要がありますが(このアルゴリズムでカバーする必要がない場合を除く)、左側のノードは常にリーフまたはブランチのいずれかです。
私が現在使用しているアルゴリズムは、次のように説明できます。
if the left child node has been swapped
swap my right node with the left child nodes right node
set the left child node as 'unswapped'
if the current node is back to its original state
swap my right node with the lowest left nodes' right node
swap the lowest left nodes two childnodes
set my left node as 'unswapped'
set my left chilnode to use this as it's original state
set this node as swapped
return null
return this;
else if the left child has not been swapped
if the result of trying to permute left child is null
return the permutation of this node
else
return the permutation of the left child node
if this node has a left node and a right node that are both leaves
swap them
set this node to be 'swapped'
アルゴリズムの望ましい動作は次のようになります。
branch
/ |
branch 3
/ |
branch 2
/ |
0 1
branch
/ |
branch 3
/ |
branch 2
/ |
1 0 <-- first swap
branch
/ |
branch 3
/ |
branch 1 <-- second swap
/ |
2 0
branch
/ |
branch 3
/ |
branch 1
/ |
0 2 <-- third swap
branch
/ |
branch 3
/ |
branch 0 <-- fourth swap
/ |
1 2
等々...