コメントでほのめかされたように、二分木の再帰的構造に従ってください。
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
ただし、これは実装が不変である場合にのみ意味があります。