java:使用ArrayDeque、LinkedList或LinkedBlockingDeque的非递归深度优先搜索?
不要使用java:使用ArrayDeque、LinkedList或LinkedBlockingDeque的非递归深度优先搜索?,java,depth-first-search,non-recursive,Java,Depth First Search,Non Recursive,不要使用ArrayList——使用Deque接口的实现之一。例如,使用一个LinkedBlockingDeque,它是为这类事情而设计的。根据需要使用addFirst()、addLast()、pollFirst()和pollLast()方法 如果出于某种原因,您确实需要使用列表,请使用链接列表——添加到数组列表的前面是非常低效的,因为所有元素都需要移动。您可以阅读javadocs了解更多信息 公共void add(int索引,E元素) 在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如
ArrayList
——使用Deque
接口的实现之一。例如,使用一个LinkedBlockingDeque
,它是为这类事情而设计的。根据需要使用addFirst()
、addLast()
、pollFirst()
和pollLast()
方法
如果出于某种原因,您确实需要使用
列表
,请使用链接列表
——添加到数组列表
的前面是非常低效的,因为所有元素都需要移动。您可以阅读javadocs了解更多信息
公共void add(int索引,E元素)
在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将一个元素添加到其索引中)
JavaDocs是你的朋友
尽管如此,正如其他人所提到的;不是要使用的最佳数据结构。如果不需要随机访问列表,则LinkedList或ArrayQue更有效。为什么不使用堆栈。堆栈是DFS的发展方向。请参阅文章,了解为什么Stack可以解决这个问题。请参见以下有用内容:)编写前置代码。对于一个队列,这应该不是很难。关于
List.addAll(int-index,CollectionI)呢?我用过它,但它占用了很多内存。
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);
}
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);
}
queue.add(0,myObject);