Suponiendo que usted tiene
struct Node
{
std::vector<Node *> children;
};
entonces lo que se podría hacer es recorrer todo el árbol a partir de las raíces de mantenimiento de toda la cadena durante el recorrido. Si encuentras p. nodo1 a continuación, guardar la cadena actual, si encuentra el nodo 2 y comprueba entonces para la intersección ... en el código (sin probar):
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;
}
Quieres decir encontrar ** LA ** ruta. A menos que permita que una ruta atraviese el mismo nodo varias veces, entonces hay solo una ruta de un nodo a otro en un árbol (esta es una de las posibles definiciones de árbol, en realidad) – 6502
@ 6502 sí, por supuesto – Yakov
He publicado una respuesta asumiendo que también le interesan las rutas que son parcialmente "ascendentes", incluso si no hay enlaces al nodo padre de un nodo en su representación. Esto no está claro en la pregunta ... – 6502