問題 59

高さ平衡二分木を構成せよ。

高さ平衡二分木では、次の性質がすべてのノードに対して成り立つ:

その左部分木の高さと右部分木の高さはほぼ等しく、その差は高々 1 である。

与えられた要素と与えられた最大高さに対して、すべての高さ平衡二分木のリストを構成せよ。

import LeanBook.Problem58

/-- 高さが `height` の高さ平衡二分木をすべて構成する -/
partial def hbalTrees {α : Type} (a : α) (height : Nat) : List (BinTree α) :=
  match height with
  | 0 => [.empty]
  | 1 => [.leaf a]
  | h + 2 => do
    let (hl, hr) ← [(h, h + 1), (h + 1, h + 1), (h + 1, h)]
    let l ← hbalTrees a hl
    let r ← hbalTrees a hr
    return BinTree.node a l r

#guard (hbalTrees 'a' 2).length = 3
#guard (hbalTrees 'a' 3).length = 15