2011-10-30 70 views
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); 
    } 

所以我應該使用ArrayDequeLinkedListLinkedBlockingDeque?當我將int值設置爲10時會發生什麼?這是否意味着隊列一次只能保持10個?如果從DB的大小檢索的集合大於10,會怎麼樣?這個綁定值是否定義了隊列的「快照」?java:非遞歸深度首先使用ArrayDeque或LinkedList或LinkedBlockingDeque進行搜索?

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); 
    } 
+0

代碼前置。對於一個隊列來說,這不應該很難。 –

+0

'List.addAll(int index,Collection c)'? – blackcompe

回答

1

不要使用ArrayList - 使用Deque接口的實現方式之一。例如,使用專爲此類事物設計的LinkedBlockingDeque。根據需要使用addFirst(),addLast(),pollFirst()pollLast()方法。

如果由於某種原因,你真的需要使用List,使用LinkedList - 添加到ArrayList的前面是極其低效的,因爲所有的元素需要被移動。

1

你可以在此列表中指定位置讀取的Javadoc ArrayList

公共無效添加(INT指數,E元素)

插入指定的元素。將當前位置的元素(如果有的話)和任何後續元素移到右側(將其中的一個添加到它們的索引)。

queue.add(0,myObject); 

的JavaDoc是你的朋友

這就是說,正如其他人所說;不是最好的數據結構。如果您不需要隨機訪問列表,則LinkedList或ArrayDeque更高效。

0

爲什麼不使用Stacks。 Stack是DFS的選擇。看到this文章,看看爲什麼堆棧將解決問題。看到這個有用的tutorial也:) :)

+0

我已經使用它,但它使用了大量的內存。 – KJW