假设我们有以下结构:
struct ATree {
string id;
int numof_children;
ATree *children[5];
};
我如何能够搜索id并输出该ID的路径?我有办法找到id是否在树中,但输出正确的路径是另一个故事。我尝试过使用字符串流,但它似乎无法正常工作(我得到的路径包含不会导致我想要的ID的ID)。注意:假设id只能在树中出现一次
这应该使用递归来完成吗?或者可以使用循环来完成吗?
答案 0 :(得分:1)
我相信下面的代码会给你一个你应该做什么的概念(递归):
bool find(const string& i_id, const ATree* i_tree, string& o_path) {
if(!i_tree) return false;
if (i_id == i_tree->id) {
o_path = i_tree->id;
return true;
}
string path;
for (size_t i = 0; i < i_tree->numof_children; ++i) {
if (find(id, i_tree->children[i], path)) {
o_path = i_tree->id + '/' + path;
return true;
}
}
return false;
}
答案 1 :(得分:0)
对于您要经历的每个节点,您基本上应该将到达的节点保持为当前状态。然后将它们弹出并在找到正确的路径时打印出来。
如果你将它们保持在std::stack
结构中,那么当你在到达离开后返回并且没有找到所需的id
时,你很容易弹出它们。
如果你递归地执行它,那么你只需要调用堆栈就足够了,如果你将它们转换为循环(迭代),那么你需要std::stack
来记住状态,但它是公平的很简单,真的。
答案 2 :(得分:0)
算法的粗略轮廓:
std::vector< const ATree* >
getPath(const ATree* tree, const std::string& id)
{
std::vector< const ATree* > path;
if (tree->id == id) {
path.push_back(tree);
} else {
for (int i=0; i < tree->numof_children; i++) {
std::vector< const ATree* > tmp=
getPath(tree->children[i], id);
if (tmp.size() > 0) {
path.push_back(tree);
path.insert(path.end(), tmp.begin(), tmp.end());
break;
}
}
}
return path;
}