難しい原因は、
- 左の部分木を走査
- 自分の値を走査
- 右の部分木を走査
という感じで、再帰する部分が2ヶ所あることだと思う。ということで、まずは、
左の子を無視して、自分→右の子と走査する
という感じで、ものすごく簡単にしてみた。するとこうなる。
/// <summary>内部イテレータ</summary> public void ForEach(Action<T> action) { JobHolder holder = new JobHolder(); ForEachDetailRight(this, action, holder); while (null != holder.Job) { holder.Job(); } } /// <summary>自分と右の子だけを走査する</summary> static void ForEachDetailRight( TreeNode<T> node, Action<T> action, JobHolder holder) { action(node._value); holder.Job = node._right == null ? (Action)null : () => ForEachDetailRight(node._right, action, holder); }
これは簡単。配列の時とほとんど変わらない。
次に、
右の子は無視して、左の子→自分と走査する
ようにしようとしたけど...、これができない!これはちょうど配列を逆にたどる感じだと思う。
この2つができたら、どうにかやって完全なイテレータができそうな気がするのだが。いや、直観だから勘違いかもしれんけど。