【问题标题】:Finding and outputting path to a unique node in C++?在 C++ 中查找和输出到唯一节点的路径?
【发布时间】:2011-12-19 23:21:22
【问题描述】:

假设我们有以下结构:

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

...每个id都是唯一的(在树中只能出现一次),如何在这种类型的树中找到id的路径并输出?

我知道如何到达节点并检查它是否存在,但我不知道如何输出正确的路径。

限制:不得使用向量/列表/堆栈数据类型。仅递归。 建议:函数look(ATree *t, string &id) 应该有一个字符串的返回类型。

是否有我可以遵循的一般递归结构?

【问题讨论】:

  • 是的。递归调用look
  • 这是作业还是拼图?无论如何,您是否允许附加字符串,否则会过于矢量化?

标签: c++ search path tree


【解决方案1】:

递归可能很难解释,但我会尽力解释它在这种情况下是如何应用的。由于您能够递归地检查每个节点是否存在,因此您需要将 id 作为返回字符串返回。这会通知递归堆栈已找到匹配项。然后将当前节点的 id 附加到字符串并将其返回到堆栈中。这反过来会通知堆栈已找到匹配项等。这是我的解决方案,我添加了多个 cmets 以更好地说明这一点。

// If found return [string] [of] [ids], else empty string
string look(const Tree * t, const string & id) {
   // If current node matchs return id
   if(t->id == id) {
      return "[" + id + "]";
   }

   // Loop over each child, recursively calling look
   for(int i=0; i<t->numof_children; i++) {
      string s = look(t->children[i], id);
      // If found add to string and return
      if(!s.empty()) {
         return "[" + t->id + "] " + s;
         // alternatively: return s + " [" + t->id + "]"; will genreate string in reverse
      }
   }

   // Not found, return empty string
   return string();
}

大多数递归函数都遵循类似的模式。如果您仍然有点迷茫,我建议您通过调试器运行它,这样您就可以确切地看到发生了什么。

【讨论】:

  • 这很有帮助,你让它看起来很简单。我总是与递归作斗争,我无法想象它是如何工作的,除非它非常简单......你对未来有什么建议吗?
  • 看看计算机程序的结构和解释。它是免费的,并且有在线讲座。在第一章中,他们对递归进行了很好的描述。这个answer 包含您需要的有关这本书的所有信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多