Я реализую алгоритм, который требует добавления и извлечения узлов из дерева в Python (в порядке FIFO).
queue = [] # empty list
root = TreeNode() # a standard TreeNode with val, left and right
Я пытаюсь сохранить в очереди как корень, так и целое число:
queue.append((root,0))
... а затем пытаюсь вытолкнуть его:
n,l = queue.pop(0)
Теперь я получаю следующую ошибку:
TypeError: cannot unpack non-iterable TreeNode object
^^^
n,l = queue.pop(0)
Я проверил, могу ли я добавить и извлечь только корневой узел, и, похоже, это работает. Проблема заключается в включении целого числа, поэтому я предполагаю, что мой синтаксис неверен. Я также попробовал:
queue.append(((root,0)))
queue.append(Tuple((root,0)))
queue.append([(root,0)]) # that one gave me ValueError: not enough values to unpack (expected 2, got 1)
Кажется, ни один из них не работает.
Можете ли вы оказать какую-либо помощь в этом вопросе?
Обновление. Как указано ниже, вот часть кода:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
queue = [] # far slower than 'deque' but should work
if not root:
return queue
queue.append((root,0))
levels = {}
while queue:
n,l = queue.pop(0)
if n:
if l not in levels:
levels[l] = []
levels[l].append(n.val)
queue.append(n.left)
queue.append(n.right)
return [[]]
Полная ошибка:
TypeError: cannot unpack non-iterable TreeNode object
^^^
n,l = queue.pop(0)
Line 17 in levelOrder (Solution.py)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ret = Solution().levelOrder(param_1)
Line 45 in _driver (Solution.py)
_driver()
Line 56 in <module> (Solution.py)
Упрощенный код в вашем вопросе (и синтаксис для распаковки кортежа из очереди) в основном работает, поэтому проблема в другом:
class TreeNode:
pass
queue = []
root = TreeNode()
queue.append((root, 0)) # A tuple.
n, l = queue.pop(0) # Works.
queue.append(root) # Just a node, not a tuple.
n, l = queue.pop(0) # Doesn't.
В полном коде обхода дерева есть
queue.append(n.left)
queue.append(n.right)
которые помещают в вашу очередь только узлы (которые невозможно распаковать).
Я думаю, ты имеешь в виду
queue.append((n.left, l))
queue.append((n.right, l))
там.
# Assume TreeNode is a class defined as follows
class TreeNode:
def __init__(self, value=0, left=None, right=None):
self.value = value
self.left = left
self.right = right
# Example tuple containing a TreeNode and an Integer
node_and_value = (TreeNode(1), 10)
# Unpacking the tuple
node, value = node_and_value
# Accessing the unpacked values
print("TreeNode value:", node.value)
print("Integer value:", value)
class TreeNode:
def __init__(self, value=29, left=0.0004, right=None):
self.value = value
self.left = left
self.right = right
queue = []
root = TreeNode()
queue.append((root, 0.7))
n, l = queue.pop(0)
print(n.value, n.left, n.right, l)
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.