生成图的BFS林

时间:2010-08-18 07:19:43

标签: java graph tree breadth-first-search

我想生成DAG(直接非循环图)的BFS林。这意味着我的Tree类需要是一般树而不是二叉树(换句话说,当我生成森林时,我无法知道节点将提前拥有的子节点数)。大部分代码都是在下面编写和显示的,但是我缺少一条线,在我的生命中,它逃脱了我!

public Tree BFS(V start)
{
    reset();
    LinkedList<GraphMatrixVertex<V>> list = new LinkedList<GraphMatrixVertex<V>>();
    GraphMatrixVertex<V> vert = dict.get(start);
    Tree root = new Tree(vert); 
    list.add(vert);
    do
    {
        vert = list.getFirst();
        Iterator<V> ni = neighbors(start);
        while(ni.hasNext())
        {
            V v = ni.next();
            GraphMatrixVertex<V> vtx = dict.get(v);
            if(!vtx.isVisited())
            {
                list.add(vtx);
                            vtx.visit();
                root.addChild(new Tree(vtx));
            }
        }
    //code goes here
    }
    while(!list.isEmpty());

    return root;
}

My Tree类存储值参数,父引用和子项列表。 我的问题是引用下一个树节点。一旦我将所有未访问的邻居添加为当前节点的子节点,我该如何到达下一个节点?

编辑:

所以它看起来像这样?

public void bfs(Tree parent)
{   
    Iterator<V> ni = neighbors((V) parent.value());
    if(ni.hasNext())
    {
            while(ni.hasNext())
            {
            V next = ni.next();
            GraphMatrixVertex<V> vert = dict.get(next);
            if(!vert.isVisited())
                parent.addChild(new Tree(next));
        }   
    }
}

递归调用在哪里?

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你可以使用递归。基本上你有一个创建一层节点的函数,然后再为你想要创建/访问的每个孩子调用自己。

编辑:

好的,我编辑了一下你的代码。首先,我删除了if(hasNext)作为其冗余内部的while循环。对于邻居列表中的每个子节点,您创建一个新的树节点,然后运行其bfs()方法,将当前的Tree对象传入。该函数返回一个列表,该列表应该是通过树的最佳路径。我也不确定你获得邻近节点的方式,看起来有点奇怪。我还没有对代码进行测试,所以可能是错字和其中的东西,但希望它能让你知道如何进行搜索。哦,当你点击一个叶子节点(你的目标?)时,它只需要设置它的权重并返回一个只有它自己的新列表。

int weight; // this should be you node traversal cost

public LinkedList<Tree> bfs(Tree parent){

    Iterator<V> ni = neighbors((V) parent.value());

    LinkedList bestPath = null;       
    int bestScore = 0xFFFFFFFF;

    while(ni.hasNext()){
        V next = ni.next();
        GraphMatrixVertex<V> vert = dict.get(next);
        if(!vert.isVisited()){
            Tree newNode = new Tree(next);
            parent.addChild(newNode);
            LinkedList path = newNode.bfs(this);
                if(newNode.weight < bestScore){
                    bestScore = weight;
                    bestPath = path;
                }
        }
    }
    weight = bestScore + this.weight;
    bestPath.addFirst(this);
    return path;   
}

编辑2:

public void bfs(Tree parent){

    Iterator<V> ni = neighbors((V) parent.value());

    while(ni.hasNext()){
        V next = ni.next();
        GraphMatrixVertex<V> vert = dict.get(next);
        if(!vert.isVisited()){
            Tree newNode = new Tree(next);
            parent.addChild(newNode);
            newNode.bfs(this);
        }
    }
}