コメントでほのめかされたように、二分木の再帰的構造に従ってください。
listbt(h)正確な高さのすべてのバイナリツリーをリストする関数を作成しますh。
type BTree = Leaf | Node(BTree, BTree)
def listbt 0 = { [Leaf] }
| listbt h = {
result = []
for T in (listbt h-1) {
for k in (0..h-1) {
for t in (listbt k) {
result += Node(T, t)
result += Node(t, T) if k < h-1 || t != T
}
}
}
return result
}
正しさは、上の基本的な帰納的証明で続きますh。
あなたがこれの結果を覚えているならlistbt、それは可能な限り効率的になるでしょう。純粋な木の数と、それによってチェックの数がt != T支配します。
あなたは用語の共有利用する(つまり、リンクだけならばという注意tとTではNode(t, T)なく、それらをコピーしないでください)あなたはかなりの出力の大きさを減らすことができます。BTreeただし、これは実装が不変である場合にのみ意味があります。