если ваш yield node.data[0]
верен, то когда вы делаете yield n[0]
в рекурсивном случае, вы делаете yield node.data[0][0]
в этой ветке. Поэтому замените его на yield n
, потому что рекурсивный случай уже дает вам то, что вам нужно, вам нужно только передать его.
Кроме того, при проектировании дерева вы обычно делаете это так, чтобы хранилище .data
, а также данные, которые пользователь вашего дерева хочет сохранить в нем и не беспокоиться о том, что это такое или как он выглядит, поэтому вы обычно делаете yield node.data
.
Также как вы находитесь в python 3, вы можете использовать yield from
, который является ярлыком для такого типа for-loop.
с теми, в виду, что ваш код должен выглядеть следующим образом
def inorderTraversal(self, node):
if node.left:
yield from self.inorderTraversal(node.left)
yield node.data
if node.right:
yield from self.inorderTraversal(node.right)
как вы не снабженным Minimal, Complete, and Verifiable example вашей проблемы, я могу только догадываться, так
Позволяет увидеть пример дерева Код:
class Node:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
с этим позволяет построить образец дерева, например, o пе в wikipedia
test1 = Node(6,
Node(2,
Node(1),
Node(4,
Node(3),
Node(5)
)
),
Node(7,
None,
Node(9,
Node(8)
)
)
)
позволяет сделать это снова с вашей структурой данных [междунар, ул]
test2 = Node([6,"F"],
Node([2,"B"],
Node([1,"A"]),
Node([4,"D"],
Node([3,"C"]),
Node([5,"E"])
)
),
Node([7,"G"],
None,
Node([9,"I"],
Node([8,"H"])
)
)
)
теперь самое интересное, функция Симметричного, первая ваша
def inorderBad(node):
if node.left:
for n in inorderBad(node.left):
yield n[0]
yield node.data[0]
if node.right:
for n in inorderBad(node.right):
yield n[0]
позволяет проверить его на test2
>>> list(inorderBad(test2))
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
list(inorderBad(test2))
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 26, in inorderBad
for n in inorderBad(node.left):
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 27, in inorderBad
yield n[0]
TypeError: 'int' object is not subscriptable
>>>
выглядит знакомым? ошибка, как я сказал, является рекурсивным случаем n[0]
, когда вы достигаете нижнего узла (в этом случае), оно дает данные [0] (в этом случае 1), в Узле выше (B) оно получает это значение и пытается выход снова только на этот раз попробовать, чтобы получить первое значение этого и не в этом отношении, как ошибки сказал
Теперь давайте это исправить
def inorder2(node):
if node.left:
for n in inorder2(node.left):
yield n
yield node.data[0]
if node.right:
for n in inorder2(node.right):
yield n
и проверить его
>>> list(inorder2(test2))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
работу как ожидается, попробуем с другим
>>> list(inorder2(test1))
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
list(inorder2(test1))
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 35, in inorder2
for n in inorder2(node.left):
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 35, in inorder2
for n in inorder2(node.left):
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 37, in inorder2
yield node.data[0]
TypeError: 'int' object is not subscriptable
>>>
Естественно, это не так, потому что inorder2 недостаточно общий, также в вашей текущей реализации, что, если вы хотите использовать строку вместо этого? есть вы думаете, на что ?, в общем те, касаются не должны иметь отношение к этой конкретной функции, она должна только предоставить все данные Симметричного
так общее заказовМои и добавив yield from
является
def inorder(node):
if node.left:
yield from inorder(node.left)
yield node.data
if node.right:
yield from inorder(node.right)
test
>>> list(inorder(test2))
[[1, 'A'], [2, 'B'], [3, 'C'], [4, 'D'], [5, 'E'], [6, 'F'], [7, 'G'], [8, 'H'], [9, 'I']]
>>> list(inorder(test1))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
Вы хотите вернуть узлы или их значения? Похоже, что 'yield node.data [0]' возвращает значение, а две for-loops обращаются к возвращаемому значению, как если бы это был узел вместо значения. – Mephy
Вы на 100% уверены, что это то, что означает 'n'? Или вы догадываетесь? Положите печатную линию, чтобы быть уверенным. – Carcigenicate
Уверены ли вы в свой тип 'n', он говорит, что это просто' int' (вероятно, из рекурсивного выхода), и вы описали 'set', который не является индексируемым. Вы смешиваете рекурсию с генераторами, если вы действительно хотите это сделать, а затем посмотрите на «yield from ...», вы можете заменить 'for n in self.inorderTraversal (node.left): выход n' с 'yield from self.inorderTraversal (node.left)' – AChampion