为什么这会导致堆栈溢出错误?有向图

时间:2018-11-26 14:19:52

标签: java recursion methods directed-graph

我正在尝试一种遍历有向图的方法,并且所有顶点都是灰色或黑色,如果变为黑色,则将根标记为黑色,并表示它不会生成树。这一直给我一个堆栈溢出错误。我希望它即使遇到黑色也仍继续进行深度搜索,以免在此之后不会丢失任何内容。

void colorRoots(Vertex root, Vertex v) {

    if (v.getColor() == DiGraph.BLACK) {
        root.setColor(DiGraph.BLACK);
    }

    for (Vertex g : v.neighbors()) {
        if (g.getColor() == DiGraph.GREY || g.getColor() == DiGraph.BLACK) {
            colorRoots(root, g); 
        }
    }
}

这是我用来遍历每个根并着色的方法。因此,我在使用根调用上述方法之前先调用此方法。

void dfs(Vertex v) {

    if(v.getColor()==DiGraph.GREY) {
        v.setColor(DiGraph.BLACK);
    }else {
        v.setColor(DiGraph.GRAY);
    }


    for (Vertex g : v.neighbors()) {
        if(g.getColor()==DiGraph.WHITE || g.getColor()==DiGraph.GREY) {
        dfs(g); 
        }
    }   
    } 

问题可能出在dsf方法中吗?

我脑海中的整个计划是从所有潜在的根中遍历一次图,然后再次进行遍历,并将所有不能产生树的根标记为黑色。

3 个答案:

答案 0 :(得分:1)

检查在dfs中拼写为“ GRAY”和“ GREY”的方式可能是问题所在。

答案 1 :(得分:0)

dfs(g)循环上的递归调用似乎没有逻辑上的终点。每个已处理的顶点对象都调用neighbors(),每个邻居Vertex都调用邻居,每个被调用的邻居都调用邻居……等等。

答案 2 :(得分:0)

通过将DSF更改为

void dfs(Vertex v) {

        v.setColor(DiGraph.GREY);

    for (Vertex g : v.neighbors()) {
        if(g.getColor()==DiGraph.WHITE) {
        dfs(g); 
        }
    }   
    v.setColor(DiGraph.BLACK);
    } 

似乎可以解决问题。