我想生成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));
}
}
}
递归调用在哪里?
答案 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);
}
}
}