如何在非二叉树中找到最长路径并将其返回到向量中?

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;

注意:我没有尝试编译或运行代码,但它应该能让您很好地了解算法的工作原理。

【讨论】:

这个效果很好。感谢您的出色回答。 (结果与指定一致与它们一样有效效率可以通过反转生成的路径来提高递归。)

以上是关于如何在非二叉树中找到最长路径并将其返回到向量中?的主要内容,如果未能解决你的问题,请参考以下文章

使用C在搜索二叉树中查找最长路径

二叉树的最长交错路径

数据结构与算法之深入解析“二叉树中的最长交错路径”的求解思路与算法示例

编写c++算法求任意二叉树中一条最长的路径,并输出此路径上各结点的值

非二叉树遍历方法

求二叉树中从根结点到叶子节点的路径