我正在使用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);
}
}
}
}
但这不是先做深度,它首先打印出连接到起始顶点的顶点,而不是遍历第一个连接的顶点,然后遍历它连接的顶点。
答案 0 :(得分:0)
那是因为你太快打印顶点了。如果您希望在访问顺序中打印它们,则需要在访问时打印(从堆栈中删除顶点后)。否则算法似乎没问题。
答案 1 :(得分: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));
}
}