如何解决用Python实现Stack的BFS二叉树
我正在寻找使用堆栈(而不是队列!)在 Python 中实现二叉树的 BFS(广度优先搜索)。
class Stack:
def __init__(self):
self.data = []
def Empty(self):
return self.data == []
def Push(self,x):
self.data.append(x)
def Pop(self):
return self.data.pop()
def Peek(self):
return self.data[len(self.data)-1]
def Size(self):
return len(self.data)
class Node:
def __init__(self,data,left,right):
self.data = data
self.l_node = left
self.r_node = right
class Tree:
def __init__(self):
self.root= None
def bfs_stack(self,node):
pass
t = Tree()
t.root = Node("1")
t.root.l_node = Node("2")
t.root.l_node.l_node = Node("4")
t.root.l_node.r_node = Node("5")
t.root.l_node.r_node.l_node = Node("8")
t.root.r_node = Node("3")
t.root.r_node.l_node = Node("6")
t.root.r_node.r_node = Node("7")
t.root.r_node.r_node.l_node = Node("9")
t.root.r_node.r_node.l_node.l_node = Node("11")
t.root.r_node.r_node.r_node = Node("10")
我创建了 Stack() 类来使用。 我试图结合递归和堆栈推送,但我没有想法。
队列实现非常简单,但对我来说有一个 Stack() 实现很重要。
解决方法
在算法上,BFS 与队列操作相关,DFS 与堆栈操作相关。
如果你只有栈,你可以用两个栈组成一个队列。
堆栈实现 FILO(先进后出)顺序,而队列实现 FIFO(先进先出)。
如果你把三个数字 1,2,3 放在一堆,然后把它们拉出来,你就会得到 3,1。
如果你对队列做同样的事情,他们会得到 1,3。
现在假设我们将 1,3 放在堆栈 A 中,将它们作为 3,1 取出,然后将它们放入堆栈 B。将它们从堆栈 B 中取出会产生 1,3,即意味着通过两个堆栈就像通过一个队列。
现在,如果您拥有整个序列并一次性输入所有内容,然后将其全部取出,那么此参数本身就起作用了。但是对于 BFS/DFSsearches 这不是真的,你输入一些东西,然后在你输入更多之前取出它们。
如果堆栈 B 完全为空,您仍然可以通过仅将东西从堆栈 A 移动到堆栈 B 来使 BFS 工作,然后将整个堆栈 A 转移到 B。B 为空确保将东西放入堆栈B 在堆栈 A 中收集事物之前全部处理。将整个 A 放入 B 可确保与中心节点距离相同的所有节点在任何给定时间都保留在同一堆栈(A 或 B)中。每次从堆栈 A 到 B 的内容传输都代表在距起始节点特定距离处处理完一个 BFS 级别,并且保证内层在外层之前处理,这就是 BFS。
stack_a = Stack()
stack_b = Stack()
stack_b.Push(t.root)
while len(stack_a)+len(stack_b)>0:
if len(stack_b) >0:
current_node = stack_b.Pop()
else:
while len(stack_a)> 0:
stack_b.Push(stack_a.Pop())
current_node = stack_b.Pop()
process(current_node) # this gets called on nodes in BFS order
for neighbor in [current_node.l_node,current_node.r_node]:
stack_a.Push(neighbor)
#can generalize this to non-binary graphs by iterating through all unvisited neighbors
#for cyclical graphs,must track processed nodes to ensure nodes don't get processed more than once
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。