1

请在此处找到以下文件 (1) Node 2)Main 3) Graph):

https://www.dropbox.com/sh/at9u2684k345uv0/dK77w58rEM

基本上我正在实现 BFS 和 DFS,并且对 Graph File 中的一些代码有一些疑问:

private Node getUnvisitedChildNode(Node n)
{

    int index=nodes.indexOf(n);
    int j=0;
    while(j<size)
    {
        if(adjMatrix[index][j]==1 && ((Node)nodes.get(j)).visited==false)
        {
            return (Node)nodes.get(j);
        }
        j++;
    }
    return null;
}

谁能告诉我是什么

(Node)nodes.get(j))

是这里的意思吗?

我还有几个问题:

在 Graph 类的 bfs() 方法中,我有以下问题:

1)据我了解

"Queue<Node> q=new LinkedList<Node>();" 

表示 LinkList 实现了一个队列。

那么,为什么在这种情况下需要 LinkedList,我们不能只通过“Queue q = new Queue();”来实现吗??

2)虽然我已经多次阅读“this”关键字的用法,但谁能解释一下原因

q.add(this.rootNode) 被使用,为什么不只是 q.add(rootNode) ?

3)以下行表示什么?

while((child=getUnvisitedChildNode(n))!=null)

谢谢

4

1 回答 1

2

如果你查看这个Graph类,你会看到这个声明:

public ArrayList nodes = new ArrayList();

这使用ArrayList类型,但不使用泛型(顺便说一句,这是一个坏主意)。代码行

((Node)nodes.get(j)).visited

意思如下:

  1. 获取 的j第 th 个元素nodes ArrayList。由于在ArrayList没有泛型的情况下使用了,这将返回一个类型为 的对象Object
  2. 将该对象转换为 a Node,这就是该对象的真正含义。
  3. 查找其中的visited字段Node

换句话说,这意味着“查找Node存储在列表中的位置jnodes然后读取其visited字段。

如果作者将泛型与 , 一起使用,那么所有这些都可以轻松避免ArrayList,如

public ArrayList<Node> nodes = new ArrayList<Node>();

如果是这种情况,查找节点并读取其visited字段的代码将是

nodes.get(j).visited

希望这可以帮助!

于 2013-04-08T05:49:12.237 回答