Итераторы

Обход иерархических структур

Различные варианты обхода элементов дерева с использованием итераторов.

private IEnumerable<TreeNode<T>> PreOrderTraverse(TreeNode<T> node)
{
  if (node == null)
    yield break;

  yield return node;

  if (!node.Leaf)
  {
    foreach (TreeNode<T> sibling in node.Siblings)
    {
      foreach (TreeNode<T> child in PreOrderTraverse(sibling))
        yield return child;
    }
  }
}
private IEnumerable<TreeNode<T>> PostOrderTraverse(TreeNode<T> node)
{
  if (node == null)
    yield break;

  if (!node.Leaf)
  {
    foreach (TreeNode<T> sibling in node.Siblings)
    {
      foreach (TreeNode<T> child in PostOrderTraverse(sibling))
        yield return child;
    }
  }
  yield return node;
}

private IEnumerable<TreeNode<T>> LevelOrderTraverse(TreeNode<T> node, bool root)
{
  if (node == null)
    yield break;

  if (root)
    yield return node;

  if (!node.Leaf)
  {
    foreach (TreeNode<T> sibling in node.Siblings)
      yield return sibling;

    foreach (TreeNode<T> child in node.Siblings)
    {
      foreach (TreeNode<T> lnode in LevelOrderTraverse(child, false))
        yield return lnode;
    }
  }
}