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); } }
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); } }
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; } }
public void DFS(Func <NNode <T>, object> func, VisitingOrder visitingOrder) { DFS(func, this.Root, visitingOrder); }
internal void VisitExpressionNodes(ExpressionNode expression, VisitingOrder order, IVisitor visitor) { VisitExpressionNodes(expression.Expression, order, visitor); visitor.Visit(expression); }