如何在非二叉树中找到最长路径并将其返回到向量中?
Posted
技术标签:
【中文标题】如何在非二叉树中找到最长路径并将其返回到向量中?【英文标题】:How to find longest path in a non-binary tree and return it in a vector? 【发布时间】:2021-12-30 17:17:16 【问题描述】:我有一个问题,我需要在非二叉树结构中找到最长的路径。我不想返回最长路径的大小,我想在vector
中返回最长路径的元素。例如,在下面的图片 中,我想找到最长的路径并将其存储在vector
中,如下所示:A,B,D,I,L
。我认为递归是一种方法,但我只是不知道如何开始围绕问题构建代码。我将节点存储在以下结构中:
std::unordered_map<std::string ID, Node> Node_data_;
struct Node
std::string id;
Name name;
std::vector<Node*> children;
Node* parent = nullptr;
;
【问题讨论】:
【参考方案1】:我无法发表评论,因为我的积分低于 50 分。 这个幼稚的解决方案也很幼稚,哈哈。
但这是我的两分钱 :) 我希望你能从中有所收获 :)
当你达到最长长度后,为什么不再次运行算法,但这次计算长度,如果累积长度等于最大长度,则说明你找到了正确的路径,从那时起,就到此为止吧。
bool recur(node_info, int length, std::vector<std::string>& vs)
...
if(length == max_length)
return true;
for (neighbor nodes of this current node)
bool haveFound = recur(next_node,length + next_node_length, vs);
if(haveFound)
vs.push_back(next_node);
return true;
您可以修改代码,使其不仅在找到的第一个最大长度处停止,而且不断耗尽树中的所有节点。
【讨论】:
我认为当发现以前最大的路径更短时,您必须在某个时候删除节点,但这是朝着正确的方向发展。 哈哈哈,我猜是这样,希望这个人发布代码,这样我们就可以知道他们的树遍历算法的一些特征。然后我们就可以开始做一些修改了 不确定约束是什么意思,但树在其他方面与二叉树非常相似,如图所示。这里唯一的区别是节点可以有两个以上的孩子。例如,不能有任何循环。最长和最短分支之间的最大差异也没有限制。一个分支从根开始的长度可以是 1,而另一个可能是 10。【参考方案2】:这是一个简单的想法,应该非常有效。如果您可以使用节点列表返回最长的链会更有效。
std::vector<std::string> longest_path(const Node* node)
std::vector<std::string> best;
for (auto* child : node->children)
auto next = longest_path(child); // recurse
if (next.size() > best.size())
best = std::move(next); // keep the longest chain.
best.insert(best.begin(), node->id); // insert current node at begining of vector.
return best;
注意:我没有尝试编译或运行代码,但它应该能让您很好地了解算法的工作原理。
【讨论】:
这个效果很好。感谢您的出色回答。 (结果与指定一致与它们一样有效。效率可以通过反转生成的路径来提高递归。)以上是关于如何在非二叉树中找到最长路径并将其返回到向量中?的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法之深入解析“二叉树中的最长交错路径”的求解思路与算法示例