搜索树并在C ++中输出该节点的路径

时间:2011-10-31 21:36:49

标签: c++ search path tree

假设我们有以下结构:

struct ATree {
  string id;
  int numof_children;
  ATree *children[5];
};

我如何能够搜索id并输出该ID的路径?我有办法找到id是否在树中,但输出正确的路径是另一个故事。我尝试过使用字符串流,但它似乎无法正常工作(我得到的路径包含不会导致我想要的ID的ID)。注意:假设id只能在树中出现一次

这应该使用递归来完成吗?或者可以使用循环来完成吗?

3 个答案:

答案 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;
}