【问题标题】:BFS / level order traversal in Non-Binary Tree using queue使用队列的非二叉树中的 BFS / 级别顺序遍历
【发布时间】:2020-12-12 16:57:31
【问题描述】:

我必须创建两个类:NonBinaryTree 和 SingleNode 类,它们包含一些在节点和整个树上工作的方法(在 NonBinaryTree 类中)。我在使用队列(先进先出类型)通过非二叉树实现 BFS(级别顺序)遍历时遇到了问题。由于二叉树有很多资源,每个节点最多有两个孩子,我没有找到任何可以帮助我解决非二叉树问题的东西。

到目前为止,我制作了这段代码:


import queue
from typing import List, Callable


class SingleNode:
    def __init__(self, name : str):
        self.name : str = name
        self.children : List['SingleNode'] = []

    def add(self, *nodes : List['SingleNode']):
        for node in nodes:
            self.children.append(node)

    def is_leaf(self):
        if len(self.children) == 0:
            return True
        return False

    def level_order_traversal(self, visit: Callable[['SingleNode'], None]) -> List[List[int]]:
        fifo = queue.Queue()
        levels = []
        fifo.put([root])
        while fifo and root:
            currNode, nextLevel = [], []
            while not fifo.empty():
                node = fifo.get()
                currNode.append(node)
                for child in node.children:
                    nextLevel.append(child)
            fifo.put(nextLevel)
            levels.append(currNode)
        return levels

    def search(self, name : str):
        if self.name == name:
            print(self.__repr__())
        for child in self.children:
            child.search(name)
        return None

    def __str__(self):
        return f"{self.name}"

    def __repr__(self):
        return f"TreeNode({self.name}) : {self.children}"
        
        
class NonBinaryTree:
    root_node: SingleNode

我的树:

enter image description here

我需要按以下顺序访问节点:1、2、3、4、5、6、7、8,依此类推...

【问题讨论】:

    标签: python tree breadth-first-search


    【解决方案1】:

    你为什么不遵循类似于二叉树中 BFS 遍历的方法,只是在这种情况下它不是二叉的,但逻辑总是相同的,

    class Solution:
        def levelOrder(self, root: 'Node') -> List[List[int]]:
            levels = []
            queue = [root]
            while queue and root:
                currNode,nextLevel = [],[]
                for node in queue:
                    currNode.append(node.val)
                    for child in node.children:
                        nextLevel.append(child)
                queue = nextLevel
                levels.append(currNode)
            return levels
    

    【讨论】:

    • 谢谢!但是我不明白这里的一切。我根据我的 clas 变量和要求调整了您的代码,但仍然无法正常工作。
    • 您能否分享您收到的错误,也许我可以尝试提供帮助。另外,我无法为您编写完整的代码,因此我们只能分享步骤或提供提示,但无法提供完整的工作解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多