0
public void traverse(Node root){
    ArrayDeque<Node> queue = new ArrayDeque<Node>();
        queue.add(root);

    while(!queue.isEmpty()){
        Node currentNode = queue.pollFirst();   
        List<Node> nl = getChildrenfromDB(currentNode);
        queue.addAll(nl);
    }

所以我应该使用ArrayDequeor LinkedListorLinkedBlockingDeque吗?当我将 int 值设置为 10 时会发生什么?这是否意味着队列一次只能容纳 10 个?如果从 DB 的大小中检索到的 Collection 大于 10 怎么办?这个绑定值是否定义了队列的“快照”?

public void traverse(Node root){
    LinkedBlockingDeque<Node> queue = new LinkedBlockingDeque<Node>(10);
        queue.add(root);

    while(!queue.isEmpty()){
        Node currentNode = queue.pollFirst();   
        List<Node> nl = getChildrenfromDB(currentNode);
        queue.addAll(nl);
    }
4

3 回答 3

1

不要使用-- 使用接口ArrayList的实现之一。Deque例如,使用 a LinkedBlockingDeque,它是为这类事情设计的。根据需要使用addFirst()addLast()pollFirst()pollLast()方法。

如果出于某种原因,你真的需要使用 a List,使用 a LinkedList-- 添加到 an 的前面ArrayList是非常低效的,因为所有元素都需要移动。

于 2011-10-30T04:53:40.183 回答
1

您可以阅读ArrayList的 javadocs

公共无效添加(int索引,E元素)

在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将其索引加一)。

queue.add(0,myObject);

JavaDocs 是您的朋友

话虽如此,正如其他人提到的那样;不是最好的数据结构。如果您不需要随机访问列表,LinkedList 或 ArrayDeque 更有效。

于 2011-10-30T05:04:04.140 回答
0

为什么不使用堆栈。堆栈是 DFS 的必经之路。看这篇文章,看看为什么 Stack 会解决这个问题。另请参阅这个有用的教程:)

于 2011-10-30T05:07:29.573 回答