Пример #1
0
        private static void LevelOrder(
            ITraversing node, Visitor visitor, ICollection <ITraversing> visited)
        {
            if (node == null || visitor == null)
            {
                return;
            }
            var queue = new Queue <ITraversing>(new[] { node });

            while (queue.Count > 0)
            {
                var next = queue.Dequeue();
                TraversingHelper.CheckCircularity(visited, next);
                if (visitor(next))
                {
                    return;
                }
                next.Traverse(child =>
                {
                    if (child != null)
                    {
                        queue.Enqueue(child);
                    }
                    return(false);
                });
            }
        }
Пример #2
0
        public static void TraverseSelfSiblingOrAncestor(
            this ITraversing node, Visitor visitor, bool withSelf, bool withAncestor)
        {
            if (withSelf && visitor(node))
            {
                return;
            }
            var self   = node;
            var parent = node.Parent;

            if (parent == null)
            {
                return;
            }
            var children = parent.Children;

            if (children.Any(sibling => self != sibling && visitor(sibling)))
            {
                return;
            }
            if (withAncestor)
            {
                TraverseAncestors(parent, visitor, true);
            }
        }
Пример #3
0
 internal static void CheckCircularity(
     ICollection <ITraversing> visited, ITraversing node)
 {
     if (visited.Contains(node))
     {
         throw new Exception($"Circularity detected for node {node}");
     }
     visited.Add(node);
 }
Пример #4
0
 public static void TraverseChildren(
     this ITraversing node, Visitor visitor, bool withSelf)
 {
     if (withSelf && visitor(node))
     {
         return;
     }
     node.Children.Any(child => visitor(child));
 }
Пример #5
0
 private static bool PostOrder(
     ITraversing node, Visitor visitor, ICollection <ITraversing> visited)
 {
     TraversingHelper.CheckCircularity(visited, node);
     if (node == null || visitor == null)
     {
         return(true);
     }
     node.Traverse(child => PostOrder(child, visitor, visited));
     return(visitor(node));
 }
Пример #6
0
 public static void TraverseDescendantsReverse(
     this ITraversing node, Visitor visitor, bool withSelf)
 {
     if (withSelf)
     {
         Traversal.ReverseLevelOrder(node, visitor);
     }
     else
     {
         var self = node;
         Traversal.ReverseLevelOrder(node, n => self != n && visitor(n));
     }
 }
Пример #7
0
        public static void TraverseRoot(this ITraversing node, Visitor visitor)
        {
            ITraversing parent;
            var         root = node;
            var         visited = new[] { node }.ToList();

            while ((parent = root.Parent) != null)
            {
                CheckCircularity(visited, parent);
                root = parent;
            }
            visitor(root);
        }
Пример #8
0
        public static void TraverseAncestors(
            this ITraversing node, Visitor visitor, bool withSelf)
        {
            var parent = node;
            var visited = new[] { node }.ToList();

            if (withSelf && visitor(node))
            {
                return;
            }
            while ((parent = parent.Parent) != null && !visitor(parent))
            {
                CheckCircularity(visited, parent);
            }
        }
Пример #9
0
        private static void ReverseLevelOrder(
            ITraversing node, Visitor visitor, ICollection <ITraversing> visited)
        {
            if (node == null || visitor == null)
            {
                return;
            }
            var queue = new Queue <ITraversing>(new[] { node });
            var stack = new Stack <ITraversing>();

            while (queue.Count > 0)
            {
                var next = queue.Dequeue();
                TraversingHelper.CheckCircularity(visited, next);
                stack.Push(next);
                var level = new List <ITraversing>();
                next.Traverse(child =>
                {
                    if (child != null)
                    {
                        level.Insert(0, child);
                    }
                    return(false);
                });
                foreach (var l in level)
                {
                    queue.Enqueue(l);
                }
            }
            while (stack.Count > 0)
            {
                if (visitor(stack.Pop()))
                {
                    return;
                }
            }
        }
Пример #10
0
 private bool Visit(ITraversing node)
 {
     _visited.Add((TreeNode)node);
     return(false);
 }
Пример #11
0
        public static void Traverse(ITraversing node, TraversingAxis axis, Visitor visitor)
        {
            if (visitor == null)
            {
                return;
            }

            switch (axis)
            {
            case TraversingAxis.Self:
                node.TraverseSelf(visitor);
                break;

            case TraversingAxis.Root:
                node.TraverseRoot(visitor);
                break;

            case TraversingAxis.Child:
                node.TraverseChildren(visitor, false);
                break;

            case TraversingAxis.Sibling:
                node.TraverseSelfSiblingOrAncestor(visitor, false, false);
                break;

            case TraversingAxis.SelfOrChild:
                node.TraverseChildren(visitor, true);
                break;

            case TraversingAxis.SelfOrSibling:
                node.TraverseSelfSiblingOrAncestor(visitor, true, false);
                break;

            case TraversingAxis.Ancestor:
                node.TraverseAncestors(visitor, false);
                break;

            case TraversingAxis.SelfOrAncestor:
                node.TraverseAncestors(visitor, true);
                break;

            case TraversingAxis.Descendant:
                node.TraverseDescendants(visitor, false);
                break;

            case TraversingAxis.DescendantReverse:
                node.TraverseDescendantsReverse(visitor, false);
                break;

            case TraversingAxis.SelfOrDescendant:
                node.TraverseDescendants(visitor, true);
                break;

            case TraversingAxis.SelfOrDescendantReverse:
                node.TraverseDescendantsReverse(visitor, true);
                break;

            case TraversingAxis.SelfSiblingOrAncestor:
                node.TraverseSelfSiblingOrAncestor(visitor, true, true);
                break;
            }
        }
Пример #12
0
 public static void Traverse(this ITraversing node, Visitor visitor)
 {
     node.Traverse(TraversingAxis.Child, visitor);
 }
Пример #13
0
 public static void TraverseSelf(this ITraversing node, Visitor visitor)
 {
     visitor(node);
 }
Пример #14
0
 public static void ReverseLevelOrder(ITraversing node, Visitor visitor)
 {
     ReverseLevelOrder(node, visitor, new List <ITraversing>());
 }
Пример #15
0
 public static void PreOrder(ITraversing node, Visitor visitor)
 {
     PreOrder(node, visitor, new List <ITraversing>());
 }