正如我记得并检查的那样,遍历树或首先抓取网络广度(BFS)的常用方法是使用队列。实际上有没有办法实现它而不使用队列?
答案 0 :(得分:4)
我知道这个问题现在已经过时了,但我只想回答。您可以使用数组,链接列表(或任何其他线性容器)执行此操作,而无需递归。当您遍历old
中的所有项目时,保留两个容器new
和old
,并将new
与old
交换。非常类似于队列的实现。
在Python中它看起来像:
def breadth_first(root):
if not root:
return
old = []
new = []
old.append(root)
while old:
for n in old:
process(n) # Do something
if n.left:
new.append(n.left)
if n.right:
new.append(n.right)
old = new
new = []
运行时复杂性与队列实现相同,O(n)。
答案 1 :(得分:2)
你真的应该使用队列,因为它更容易实现。此外,队列允许多台计算机一起工作(一个队列站点,而另一个队列从队列中弹出站点以进行遍历)。
我看到这样做的唯一另一种方法是使用递归(更加困难,并且只使用或多或少的内存)。
答案 2 :(得分:0)
递归。但队列在堆栈中......
答案 3 :(得分:-1)
如果您关心订购,请使用队列。 queue保留插入顺序。或者你可以使用list的实现,比如两个数组列表来交替。但从根本上说,列表也保留了订购。
如果您不关心订购,可以使用任何设置实现。集合不保留这种排序。
例如,在BFS实现中,如果您不关心节点的排序,您可以使用两个集合,旧的和新的交替,而不是队列。