Мне нужно найти путь или пути по сложной структуре графа. График построен с использованием чего-то похожего на это:
class Node
{
public string Value { get; set;}
public List<Node> Nodes { get; set;}
public Node()
{
Nodes = new List<Node>();
}
}
Что делает это сложным, так это то, что узлы могут ссылаться на более ранний узел. Например,
A -> C -> E -> A
Что мне нужно сделать, это получить список стеков, представляющих пути через узлы, пока я не доберусь до узла с определенным значением. Поскольку это возможно, может быть доступно несколько очень больших путей, у нас может быть максимальное количество узлов, которые можно попробовать.
List<Stack<Node>> paths = FindPaths(string ValueToFind, int MaxNumberNodes);
У кого-нибудь есть способ построить это (или что-то подобное)? Я делал рекурсию в прошлом, но по какой-то причине у меня полный мозг и пердеж. В моем вопросе указано лямбда-выражение, но использование лямбда-выражения необязательно. Буду благодарен за любое решение.
Примечание: я снял класс с отличного ответа Аку для этого рекурсивного вопроса . Хотя его элегантное решение, показанное ниже, пересекает древовидную структуру, оно, похоже, не обеспечивает достаточной гибкости для выполнения того, что мне нужно (например, отклонение путей, которые являются круглыми, и отслеживание путей, которые успешны).
Action<Node> traverse = null;
traverse = (n) => { Console.WriteLine(n.Value); n.Nodes.ForEach(traverse);};
traverse(root); // where root is the tree structure
Редактировать
Основываясь на комментариях и ответах ниже, я нашел отличное решение в CodeProject. Он использует алгоритм поиска пути A *. Вот ссылка.