Как правильно распаковать кортеж, состоящий из TreeNode и Integer?

Я реализую алгоритм, который требует добавления и извлечения узлов из дерева в 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)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
63
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Упрощенный код в вашем вопросе (и синтаксис для распаковки кортежа из очереди) в основном работает, поэтому проблема в другом:

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)

Другие вопросы по теме