通过递归查找从节点到树中的根的所有父项

时间:2015-05-08 14:19:22

标签: c++ algorithm recursion

我有一个Graph类,为树建模。图包含指向我当前实例(我当前节点)的父项的指针Graph*

class Graph
{
private:

    Graph* parent;
public:
    Graph* getparent();
}

Graph* Graph::getparent()
{
    return this->parent;
}

如果是root,则父级位于nullptr

我试图从节点开始寻找从节点到根的距离。

这是我的尝试:

int Graph::howManyParents(Graph* unparent)
{
    int nbParents(0);
    if(unparent != nullptr)
    {
        nbParents++;
        nbParents =+ howManyParents(this->parent);
    }
    return nbParents;
}

它编译但崩溃。调试器向我展示了对该方法的大量调用,但最终得到了SegFaulting。我的算法有问题吗?

3 个答案:

答案 0 :(得分:3)

你的递归永远不会停止,除非你把它传递给根,因为你总是调用this->howManyParents,因此传递给它的同一个父,它不会变为空。

目前还不清楚您是想要距参数的距离还是距离this的距离。

查找给定节点的距离(没有理由成为其成员):

int howManyParents(Graph* unparent)
{
    int nbParents(0);
    if(unparent != nullptr)
    {
        nbParents = howManyParents(unparent->getparent()) + 1;
    }
    return nbParents;
}

查找this的距离:

int Graph::howManyParents()
{
    int nbParents(0);
    if(parent != nullptr)
    {
        nbParents = parent->howManyParents() + 1;
    }
    return nbParents;
}

答案 1 :(得分:2)

我认为你导致堆栈溢出太深或无限递归。

检查输入是否存在错误以确保它确实是树,因为如果图中出现循环,递归将是无限的。

另外,尝试增加程序的堆栈大小。

在Linux上运行命令:

ulimit -s unlimited

要在Microsoft Visual C ++中执行此操作,只需将此行添加到代码中:

#pragma comment(linker, '/STACK:67108864');

要在MinGW G ++中执行此操作,请将此选项添加到编译行:

-Wl,--stack,67108864

但是,我认为非递归解决方案总体上更好。

int Graph::howManyParents(Graph* unparent)
{
    int nbParents(0);
    while (unparent != nullptr)
    {
        nbParents++;
        unparent = unparent->parent;
    }
    return nbParents;
}

最好使用循环而不是递归,这样可以提高性能和代码可读性。

仅在真正需要的地方使用递归。例如,遍历树。

答案 2 :(得分:1)

你可以这样做:

int Graph::howManyParents()
{
    return getparent() ? getparent()->howManyParents() + 1 : 0;
}

另外,不要忘记编写构造函数来创建parent = nullptr,它不是默认构造函数。