1

我正在实现用户使用jung绘制的图形的深度优先遍历。

我现在有以下代码:

 public <V,E> void dftdraw(Graph<V,E> g) {
    V start = null;      
    for (V v:g.getVertices()){
        if(v.toString().equals("0"))
           start = v; 
    }

    Set visited = new HashSet();
    LinkedList stack = new LinkedList();
    stack.add(start);
    System.out.println(start.toString());
    // traverse through graph in depth-first order
    while (!stack.isEmpty())
    {
        V v = (V)stack.removeFirst();
        visited.add(v);
        Set neighbors = (Set) g.getNeighbors(v);

        for (Iterator n_it = neighbors.iterator(); n_it.hasNext(); )
        {
            V w = (V)n_it.next();

            if (!visited.contains(w)){
                System.out.println(w.toString());
                stack.addFirst(w);
            }
        }
    }
}

但这不是先做深度,它首先打印出连接到起始顶点的顶点,而不是像遍历第一个连接的顶点,然后遍历它的连接顶点。

4

2 回答 2

0

那是因为您过早地打印顶点。如果您希望它们按访问顺序打印,则需要在访问时打印(在从堆栈中删除顶点之后)。否则算法似乎没问题。

于 2013-04-14T20:32:56.433 回答
0

所以,现在我正在使用以下代码通过递归进行深度优先遍历:

public <V, E> void dftdraw(Graph<V, E> g) {

    V start = null;

    for (V v : g.getVertices()) {
        if (v.toString().equals(jTextField2.getText())) {
            start = v;
        }

    }

    if(!visiteddfs.contains(start)) {
        dfspath(g,start);
    }


    for(int i=0;i<l2.size();i++){

        jTextField4.setText(jTextField4.getText() + " " + l2.get(i));
    }

}

public <V,E> void dfspath(Graph<V,E> g,V v){

    visiteddfs.add(v);
    l2.add(v);
    Set neighbors = (Set) g.getNeighbors(v);
        //System.out.println(v);

        for (Iterator n_it = neighbors.iterator(); n_it.hasNext();) {
            V w = (V) n_it.next();

        if(!visiteddfs.contains(w)){

            dfspath(g,w);
        }

    }
    finisheddfs.add(v);

}

并稍作修改,问题中发布的代码用于广度优先遍历。这是代码:

    public <V, E> void bstdraw(Graph<V, E> g) {

    V start = null;

    for (V v : g.getVertices()) {
        if (v.toString().equals(jTextField1.getText())) {
            start = v;
        }
    }

    Set visited = new HashSet();
    LinkedList stack = new LinkedList();
    stack.add(start);
    visited.add(start);
    l.add(start);
    // traverse through graph in depth-first order
    while (!stack.isEmpty()) {
        V v = (V) stack.removeFirst();
        Set neighbors = (Set) g.getNeighbors(v);
        //System.out.println(v);

        for (Iterator n_it = neighbors.iterator(); n_it.hasNext();) {
            V w = (V) n_it.next();

            if (!visited.contains(w)) {
                l.add(w);
                g2.addEdge("edge" + w, (Integer) v, (Integer) w);
                jPanel4.repaint();
                jPanel4.updateUI();

                visited.add(w);
                stack.addLast(w);

            }
        }
    }

    for (int i = 0; i < l.size(); i++) {

        jTextField3.setText(jTextField3.getText() + " " + l.get(i));

    }
}
于 2013-04-14T20:46:54.470 回答