Python - 使用 dict vs queue 的层序遍历
Python - level order traversal using dict vs queue
我对Algo & DS的理解有点菜鸟。而且我不确定这是否是一个重复或相关的问题,或者是否完全微不足道。每当我看到级别顺序遍历或 BFS 被提及时,我都会看到使用了 queue。我无法理解它的复杂性,就 space 而言,更重要的是 时间复杂度 ,against 我的实现使用词典。
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 顺序。
我会这样建议:
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
我对Algo & DS的理解有点菜鸟。而且我不确定这是否是一个重复或相关的问题,或者是否完全微不足道。每当我看到级别顺序遍历或 BFS 被提及时,我都会看到使用了 queue。我无法理解它的复杂性,就 space 而言,更重要的是 时间复杂度 ,against 我的实现使用词典。
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 顺序。 我会这样建议:
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