使用dict vs queue的Python级顺序遍历

使用dict vs queue的Python级顺序遍历,python,time-complexity,tree-traversal,breadth-first-search,Python,Time Complexity,Tree Traversal,Breadth First Search,我对Algo&DS的理解有点新手。我不确定这是一个重复的或相关的问题,还是一个完全无关紧要的问题。无论我在哪里看到级别顺序遍历或提到BFS,我都会看到使用队列。我无法理解这其中的复杂性,在空间方面,更重要的是时间复杂性,与我使用字典的实现相比 def getLevelElements(tree, level=0, cont={}): """Get mapping of level and elements in a level :param tree: Input tree, e

我对Algo&DS的理解有点新手。我不确定这是一个重复的或相关的问题,还是一个完全无关紧要的问题。无论我在哪里看到级别顺序遍历或提到BFS,我都会看到使用队列。我无法理解这其中的复杂性,在空间方面,更重要的是时间复杂性与我使用字典的实现相比

def getLevelElements(tree, level=0, cont={}):
    """Get mapping of level and elements in a level
    :param tree: Input tree, ex.
        1
            2
                4
                5
                    8
                    9
            3
                6
                7
                    10
                    None
    :return: {0: [1], 1: [2, 3], 2: [4, 5, 6, 7], 3: [8, 9, 10]}
    """
    if tree is not None:
        cont.setdefault(level, []).append(tree.root)
    if tree.leftChild is not None:
        getLevelElements(tree.leftChild, level + 1, cont)
    if tree.rightChild is not None:
        getLevelElements(tree.rightChild, level + 1, cont)
    return cont


def levelOrderTraversalOut(tree):
    levelElementsMap = getLevelElements(tree)
    out = []
    for elements in levelElementsMap.values():
        out += elements
    return out

我的要求是使用级别顺序遍历在列表中获取树的元素。

如果我理解正确,您需要树元素的BFS顺序。 我建议smth如下:

def bfs(tree):
    out = []
    elements = [tree.root]
    while elements:
        elem = elements.pop(0)
        out.append(elem)
        if elem.leftChild:
            elements.append(elem.leftChild)
        if elem.rightChild:
            elements.append(elem.rightChild)
    return out

如果我没弄错的话,你需要一个BFS的树元素顺序。 我建议smth如下:

def bfs(tree):
    out = []
    elements = [tree.root]
    while elements:
        elem = elements.pop(0)
        out.append(elem)
        if elem.leftChild:
            elements.append(elem.leftChild)
        if elem.rightChild:
            elements.append(elem.rightChild)
    return out

对。不过,您是否也可以帮助我了解您的解决方案相对于我的解决方案的复杂性—时间和空间?是的。在这两种解决方案中,树的每个元素只遍历一次,因此它们具有线性时间复杂度。这两种解决方案中的空间复杂性也是一样的。不过,您是否也可以帮助我了解您的解决方案相对于我的解决方案的复杂性—时间和空间?是的。在这两种解决方案中,树的每个元素只遍历一次,因此它们具有线性时间复杂度。这两种解决方案的空间复杂性也是一样的。