【问题标题】:breadth first search traversal in pythonpython中的广度优先搜索遍历
【发布时间】:2015-04-08 17:21:21
【问题描述】:

我知道已经有一些关于此的问题,我已经查看了它们并尝试使用这些答案来解决问题,但我仍然遇到问题。出于某种原因,我的广度搜索要么陷入无限循环,要么说它不能从空列表中dequeue

这里是代码

def enqueue(self, data):
    self.queue_list.append(data

def dequeue(self):
    return self.queue_list.pop(0)

def breadth(self):
    string = ""
    queue = q.Queue()
    root = self.root
    queue.enqueue(root.data)
    string += str(queue.dequeue())

    while queue != None:
        if root.left != None:
            queue.enqueue(root.left.data)
            root = root.left
        if root.right != None:
            queue.enqueue(root.right.data)
            root = root.right
        data = queue.dequeue()
        string += str(data)

    return string

【问题讨论】:

  • 你能添加你的入队和出队方法吗?似乎问题将位于其中一种方法中,很可能是出队。在这种情况下q 是什么,q.Queue() 做什么?
  • 针对这些方法进行了更新,我只是调用了位于其中的模块并初始化队列。
  • 除了错误的 while 循环条件之外,您在第一个 if 和同时检查第二个 if 条件时覆盖了您的根,它可能与循环开始时不同,这可能不是您想要实现

标签: python python-3.x data-structures tree


【解决方案1】:

您在while 循环中的检查不应该是queue != None

您应该检查队列何时为空。永远不会是None

按照编码,您将某些内容排队,然后将其出列,因此队列为空,然后您进入 while 循环,因为虽然队列为空,但它不是 None

然后您尝试在 while 循环结束附近进行双端队列,这会导致您的错误。

【讨论】:

  • 他的q.Queue() 方法可能会在某个时候返回None。但是你绝对是对的,如果创建了一个队列,它就不会变成无。
【解决方案2】:

您需要将节点推送到队列中,而不仅仅是数据。否则你只会走在树的右边(第二个 if 语句覆盖根)。
我不确定你的数据结构,所以只使用 collections.deque

from collections import deque

def breadth(self):
    string = ""
    q = deque([self.root])
    while q:
        node = q.popleft()
        string += str(node.data)
        if node.left:
            q.append(node.left)
        if node.right:
            q.append(node.left)
    return string

【讨论】:

  • 谢谢你让我找到解决方案
【解决方案3】:

使用上述提示的最终解决方案

 def breadth_first(self):

    string = ""
    queue = q.Queue()
    root = self.root
    queue.enqueue(root)

    while len(queue.queue_list) > 0:
        node = queue.dequeue()
        string += str(node.data) + " "
        if node.left != None:
            queue.enqueue(node.left)
        if node.right != None:
            queue.enqueue(node.right)
    return string

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多