2011-10-31 68 views
1

假设我们有以下结构:搜索树和输出的路径在C++节点

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

我如何将能够路径搜索ID和输出到ID?我有一种方法来查找id是否在树中,但输出正确的路径是另一回事。我曾尝试使用字符串流,但它似乎并没有正常工作(我得到的路径,包括ID不会导致我想要的ID)。注意:假定ids可能只在树中出现一次

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

+0

任何递归可循环被改写。 – littleadv

+0

我建议将访问过的节点存储在一个'std :: vector'或'std :: list'中,这就是你记录到节点的路径。 – hochl

+0

@littleadv:这是一个比我以前听说过的要强的说法,如果不在其他地方实施堆栈,我不认为它是真实的。 –

回答

0

对于您正在经历的每个节点,您应该基本上保留从哪个节点到达当前节点。然后将它们弹出并在您找到正确路径时将其打印出来。

如果将它们保留在std::stack结构中,当您在到达树叶后返回并且找不到所需的id时,您将很容易弹出它们。

如果你递归执行,那么你只需要有你的调用堆栈,它应该是足够的,如果你将它们转换为循环(迭代),那么你需要std::stack记住状态,但它非常简单,真的。

+0

我无法使用堆栈。替代? – DillPixel

+0

@DillPixel - 那么也许你应该列出所有的限制,而不是等待解决方案,然后说你不允许使用这个或那个? – littleadv

+0

使用我的解决方案,它不使用堆栈:) – hochl

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; 
} 
+0

现在更好。 OP说他不能使用'std :: stack',我猜想'std :: vector'也是一样,但我想我们可以让他找出如何改变他允许使用的东西。 – littleadv

+0

我误解了要求,它只是一个粗略的提纲。现在这个代码有效,我写了一个小树创建和搜索范例来验证。 – hochl

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; 
} 
+0

嗨,为什么代码在if(i_id == i_tree-> id)中返回false,或者是一个错误?这也许听起来很愚蠢,但我在哪里输出路径(到标准输出)?我认为它应该去的位置不起作用,如果说ID是在树的第三层... – DillPixel

+0

Nvm,我知道它使用你的想法+ stringstream工作。谢谢。 – DillPixel

+0

是的,这是错误的。我会纠正它。 –