再左の葉から根へ

できたっぽい?こんな感じ。

/// <summary>左と自分を処理する</summary>
static void ForEachDetailLeft(
  TreeNode<T> root,
  Action<T> action,
  JobHolder holder)
{
  // nodeを根として、最小のノードまで進む
  TreeNode<T> n = root;
  while (n._left != null) n = n._left;

  // そこから戻ってくる
  Predicate<TreeNode<T>> checkTerm = node => node == root;
  ForEachDetailLeftRec(n, checkTerm, action, holder);
}

static void ForEachDetailLeftRec(
  TreeNode<T> node,
  Predicate<TreeNode<T>> checkTerm,
  Action<T> action,
  JobHolder holder)
{
  action(node._value);
  holder.Job =
    checkTerm(node) ?
    (Action)null :
    () => ForEachDetailLeftRec(node._parent, checkTerm, action, holder);
}

「根から始めなきゃ!」って考えるから難しくなってた。素直に葉から始めれば、根→最右の葉の時と似てるような気がするよ。

家にネット環境が無いので書きためてて、前回のエントリと今回のエントリの投稿時間がほとんど変わらないけど、実はこれに半日くらい悩んでるのよ...。
さて、ここからどうしよか。