private Node Traverse(Node node)
        {
            Arc matchedArc = matching.MatchedArc(node);

            if (IsRed(node))
            {
                foreach (var arc in Graph.Arcs(node))
                {
                    if (arc != matchedArc)
                    {
                        Node y = Graph.Other(arc, node);
                        if (!parentArc.ContainsKey(y))
                        {
                            parentArc[y] = arc;
                            if (!matching.HasNode(y))
                            {
                                return(y);
                            }
                            Node result = Traverse(y);
                            if (result != Node.Invalid)
                            {
                                return(result);
                            }
                        }
                    }
                }
            }
            else
            {
                Node y = Graph.Other(matchedArc, node);
                if (!parentArc.ContainsKey(y))
                {
                    parentArc[y] = matchedArc;
                    Node result = Traverse(y);
                    if (result != Node.Invalid)
                    {
                        return(result);
                    }
                }
            }

            return(Node.Invalid);
        }
        private Node Traverse(Node node)
        {
            Arc arc = matching.MatchedArc(node);

            if (IsRed(node))
            {
                foreach (Arc item in Graph.Arcs(node, ArcFilter.All))
                {
                    if (item != arc)
                    {
                        Node node2 = Graph.Other(item, node);
                        if (!parentArc.ContainsKey(node2))
                        {
                            parentArc[node2] = item;
                            if (!matching.HasNode(node2))
                            {
                                return(node2);
                            }
                            Node node3 = Traverse(node2);
                            if (node3 != Node.Invalid)
                            {
                                return(node3);
                            }
                        }
                    }
                }
            }
            else
            {
                Node node4 = Graph.Other(arc, node);
                if (!parentArc.ContainsKey(node4))
                {
                    parentArc[node4] = arc;
                    Node node5 = Traverse(node4);
                    if (node5 != Node.Invalid)
                    {
                        return(node5);
                    }
                }
            }
            return(Node.Invalid);
        }