Итак, я пытаюсь определить функцию, которая инвертирует двоичное дерево, и когда я запускаю приведенный ниже код, а затем выполняю a_node.binInversion()
, я получаю сообщение об ошибке «NameError: имя« binInversion »не определено». Почему эта ошибка происходит?
Код, который я выполняю, выглядит следующим образом:
class BinaryTree:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def insert_left(self, value):
if self.left == None:
self.left = BinaryTree(value)
else:
new_node = BinaryTree(value)
new_node.left = self.left
self.left = new_node
def insert_right(self, value):
if self.right == None:
self.right = BinaryTree(value)
else:
new_node = BinaryTree(value)
new_node.right = self.right
self.right = new_node
def binInversion(self):
if self.left is None and self.right is None:
return 0
else:
binInversion(self.left)
binInversion(self.right)
self.left, self.right = self.right, self.left
a_node = BinaryTree('a')
a_node.insert_left('b')
a_node.insert_right('c')
b_node = a_node.left
b_node.insert_right('d')
c_node = a_node.right
c_node.insert_left('e')
c_node.insert_right('f')
d_node = b_node.right
e_node = c_node.left
f_node = c_node.right
a_node.binInversion()
Кроме того, я знаю, что существует высокая вероятность того, что функция binInversion()
не будет работать должным образом. Пожалуйста, НЕ раскрывайте решение для инвертирования двоичного дерева, так как я хочу попробовать его самостоятельно, прежде чем смотреть на решение.
Как сказал Куарама. Есть проблема в binInversion
. Должен ли binInversion
вызываться рекурсивно? Если это так, то, по-видимому, он не должен принимать аргумент, но в вашем коде он принимает...
@quamrana Я не слежу. Определение находится прямо в коде.
Да, но вы не можете получить к нему доступ с помощью кода, который вы показываете. Возможно, Вы имели в виду: self.binInversion()
?
@quamrana Не могли бы вы объяснить, почему он недоступен? Вы предполагаете, что он недоступен, потому что это метод экземпляра, и предлагаете мне преобразовать его в метод класса?
Вы определили binInversion()
как члена вашего класса, и есть два способа получить к нему доступ. Просто написать binInversion(self.left)
не один из них. Что вы можете сделать, так это написать self.binInversion()
, как я уже дважды предлагал. Или, что более необычно, BinaryTree.binInversion(self)
.
@quamrana Спасибо за ваш вклад. Я наконец-то понял.
несколько ошибок здесь:
self.binInversion()
вместо binInversion()
def binInversion(self, node)
, чтобы передать другой аргумент или узел.Ну, это тот же метод, что и два других, то есть «insert_left» и «insert_right». Также я хочу, чтобы это был объектный метод, а не метод класса, чтобы иметь возможность инвертировать дерево, начинающееся с определенного узла, а не всегда инвертировать все дерево, начиная с корня. Я не совсем следую.
Вы не определили
binInversion
. Возможно, Вы имели в виду:self.binInversion()
?