Giả sử bạn có
struct Node
{
std::vector<Node *> children;
};
sau đó có thể làm gì được đi qua toàn bộ cây bắt đầu từ gốc giữ toàn bộ chuỗi trong traversal. Nếu bạn thấy, ví dụ: node1 sau đó bạn lưu các chuỗi hiện tại, nếu bạn thấy node2 sau đó bạn kiểm tra sự giao nhau ... trong mã (chưa được kiểm tra): tìm kiếm tìm kiếm và chiều sâu-đầu tiên
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;
}
Bạn có nghĩa là tìm ** đường dẫn **. Trừ khi bạn cho phép một con đường đi qua cùng một nút nhiều lần thì chỉ có một đường dẫn từ nút này đến nút khác trong cây (đây là một trong các định nghĩa có thể có của cây, thực tế) – 6502
@ 6502 có tất nhiên – Yakov
Tôi đã đăng câu trả lời giả sử bạn cũng quan tâm đến các đường dẫn có phần "trở lên" ngay cả khi không có liên kết đến nút cha của nút trong biểu diễn của bạn. Điều này không thực sự rõ ràng trong câu hỏi ... – 6502