【发布时间】:2012-09-24 17:21:06
【问题描述】:
我用 Java 为一棵树编写了以下 BFS:
public class Node
{
public int value;
public ArrayList<Node> myChildren = new ArrayList<Node>();
public Node(int v)
{
value = v;
}
}
public Node breadthFirstSearch(Node root, int value)
{
if(root == null) return null;
Queue<Node> nodesToVisit = new LinkedList<Node>();
nodesToVisit.add(root);
while(nodesToVisit.size() > 0)
{
Node currentNode = nodesToVisit.remove();
if(currentNode.value == value) return currentNode;
nodesToVisit.addAll(currentNode.myChildren);
}
return null;
}
我的问题是,当我“访问”节点if(currentNode.value == value) 时(就运行时复杂性或其他因素而言)是否重要。我可以在将节点从队列中弹出之后访问该节点,也可以在将其放入队列之前访问它。
【问题讨论】:
-
我觉得这个更适合codereview.stackexchange.com
-
如果您一遇到该节点就访问它,您的搜索权重会比它本来就更偏向“左”(第一个孩子优先)。
-
您的
while循环最好重述为do ... while (!nodesToVisit.isEmpty())。当然它在循环开始时永远不会为空,那么为什么要检查那个不可能的条件呢? -
@seh 我使用普通的 while 循环来执行此操作,因为我觉得它增加了代码的可读性并且额外评估条件一次不会产生任何明显的影响(只有一些额外的机器指令) ....但是,我理解你的意思
-
我相信你,但有一种不同的可读性处于危险之中:读者需要理解为什么会有保护条件,合理地预期可能会出现保护条件。如果这些条件似乎不能出现,那么您的程序受到过度约束并且接近于逻辑不一致。编写循环的另一种方法是不费心将根节点添加到队列中,并提前对其进行特殊处理。相反,您将其添加到队列中以避免重复循环主体的一部分。这很好,但不要做额外的工作以避免代码重复。
标签: java graph tree breadth-first-search