예제 #1
0
 internal void VisitExpressionNodes(IExpression expression, VisitingOrder order, IVisitor visitor)
 {
     if (expression is BinaryExpressionNode)
     {
         VisitExpressionNodes((BinaryExpressionNode)expression, order, visitor);
     }
     else if (expression is ExpressionNode)
     {
         VisitExpressionNodes((ExpressionNode)expression, order, visitor);
     }
     else
     {
         visitor.Visit(expression);
     }
 }
예제 #2
0
 internal void VisitExpressionNodes(BinaryExpressionNode binaryExpression, VisitingOrder order, IVisitor visitor)
 {
     if (order == VisitingOrder.PreOrder)
     {
         visitor.Visit(binaryExpression);
         VisitExpressionNodes(binaryExpression.Left, order, visitor);
         VisitExpressionNodes(binaryExpression.Right, order, visitor);
     }
     else if (order == VisitingOrder.InOrder)
     {
         VisitExpressionNodes(binaryExpression.Left, order, visitor);
         visitor.Visit(binaryExpression);
         VisitExpressionNodes(binaryExpression.Right, order, visitor);
     }
     else if (order == VisitingOrder.PostOrder)
     {
         VisitExpressionNodes(binaryExpression.Left, order, visitor);
         VisitExpressionNodes(binaryExpression.Right, order, visitor);
         visitor.Visit(binaryExpression);
     }
 }
예제 #3
0
        public void DFS(Func <NNode <T>, object> func, NNode <T> startNode, VisitingOrder visitingOrder)
        {
            HashSet <NNode <T> > visitedNodes = new HashSet <NNode <T> >();
            Stack <NNode <T> >   dfsStack     = new Stack <NNode <T> >();
            var curr = Root;

            while (curr != null)
            {
                //if (visitingOrder == VisitingOrder.Pre)
                //{
                //    if (!curr.Visited)
                //    {
                //        func(curr);
                //        curr.Visited = true;
                //    }
                //}

                NNode <T> next = (curr.Children.Count == 0) ? null : curr.Children.FirstOrDefault(p => !visitedNodes.Contains(p));

                if (next == null)
                {
                    if (visitingOrder == VisitingOrder.Post)
                    {
                        func(curr);
                        visitedNodes.Add(curr);
                    }
                    if (dfsStack.Count != 0)
                    {
                        next = dfsStack.Pop();
                    }
                }
                else
                {
                    dfsStack.Push(curr);
                }
                curr = next;
            }
        }
예제 #4
0
 public void DFS(Func <NNode <T>, object> func, VisitingOrder visitingOrder)
 {
     DFS(func, this.Root, visitingOrder);
 }
예제 #5
0
 internal void VisitExpressionNodes(ExpressionNode expression, VisitingOrder order, IVisitor visitor)
 {
     VisitExpressionNodes(expression.Expression, order, visitor);
     visitor.Visit(expression);
 }