我需要获得树的所有可能路径,所以我实现了这样的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);
}
}
上面的代码为我提供了长度为“steps”的树的某些结束节点的所有路径。然后我循环遍历所有结束节点并运行它以获取每个路径。问题是需要永远!我想可能硬编码所有可能的组合以加快速度,当然我不能手工完成这个,因为例如一个25步的树将有2 ^ 25~ = 3500万种可能的组合,但也许我可以打印搜索的输出和使用硬编码?或者有人看到我能做出的任何简单的优化会对性能产生重大影响吗?感谢。
编辑:让我澄清一下。我需要路径,即沿着树的移动顺序,其中1代表右手移动,0代表左手(或者你喜欢的上/下)。所以例如一个2步树,我需要四个有序对(1,0)(0,1)(1,1)(0,0)。答案 0 :(得分:1)
由于“所有组合”应该仅仅意味着“在某个水平上向右/向左转动的组合”,你可以只循环0到2 ^ n - 1,并且前面填充0的二进制表示可能正是你想要的。
如果你想要的是左转数等于某个数k的路径数,那么这只等于0到2 ^ n - 1的数字,k比特等于1,你可以使用这可以计算出你想要的结果。