Итераторы
Обход иерархических структур
Различные варианты обхода элементов дерева с использованием итераторов.
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; } } }