Przypuśćmy masz
struct Node
{
std::vector<Node *> children;
};
następnie co można zrobić przemierza całe drzewo zaczynając od korzenia utrzymując cały łańcuch podczas przechodzenia. Jeśli znajdziesz np. node1 następnie zapisać bieżący łańcuch, jeśli okaże node2 następnie sprawdzić na skrzyżowaniu ... w kodzie (NIETESTOWANY):
bool findPath(std::vector<Node *>& current_path, // back() is node being visited
Node *n1, Node *n2, // interesting nodes
std::vector<Node *>& match, // if not empty back() is n1/n2
std::vector<Node *>& result) // where to store the result
{
if (current_path.back() == n1 || current_path.back() == n2)
{
// This is an interesting node...
if (match.size())
{
// Now is easy: current_path/match are paths from root to n1/n2
...
return true;
}
else
{
// This is the first interesting node found
match = current_path;
}
}
for (std::vector<Node *>::iterator i=current_path.back().children.begin(),
e=current_path.back().children.end();
i != e; ++i)
{
current_path.push_back(*i);
if (findPath(current_path, n1, n2, match, result))
return true;
current_path.pop_back(); // *i
}
return false;
}
Masz na myśli znalezienie ** ścieżki **. O ile nie pozwala się na wielokrotną ścieżkę przechodzącą przez ten sam węzeł, to istnieje tylko jedna ścieżka z jednego węzła do drugiego w drzewie (jest to faktycznie jedna z możliwych definicji drzewa). – 6502
@ 6502 Tak, oczywiście – Yakov
Wysłałem odpowiedź zakładając, że jesteś zainteresowany również ścieżkami, które są częściowo "w górę", nawet jeśli nie ma żadnych linków do węzła nadrzędnego węzła w twojej reprezentacji. Nie jest to jasne w pytaniu ... – 6502