我需要获取树的所有可能路径,所以我实现了这样的 DFS:
void bisearch(std::vector<int> path, int steps,
int node, std::vector<std::vector<int>> *paths) {
int sum = 0;
if (path.size() == steps) {
for(std::vector<int>::iterator it=path.begin(); it != path.end(); ++it) {
sum += (*it);
}
if (sum == node)
paths->push_back(path);
}
else {
std::vector<int> uPath(path);
uPath.push_back(1);
bisearch(uPath, steps, node, paths);
std::vector<int> dPath(path);
dPath.push_back(0);
bisearch(dPath, steps, node, paths);
}
}
上面的代码为我提供了到某个结束节点的所有路径,以获取长度为“步骤”的树。然后我遍历所有结束节点并运行它以获取每条路径。问题是它需要永远!我正在考虑可能对所有可能的组合进行硬编码以加快速度,当然我不能手动执行此操作,因为例如一棵有 25 个步骤的树将有 2^25 ~= 3500 万种可能的组合,但也许我可以打印搜索的输出并将其用于硬编码?或者有没有人看到我可以做的任何简单的优化会对性能产生很大的影响?谢谢。
编辑:让我澄清一点。我需要路径,即沿树的移动序列,其中 1 代表右手移动,0 代表左手(或上/下,随你喜欢)。因此,例如一个两步树,我需要四个有序对 (1,0) (0,1) (1,1) (0,0)。