Ваш код содержит несколько разных ошибок. Некоторые из них касаются того, как вы модифицируете self.root
(или не можете), другие связаны с попытками рекурсии для неправильных типов.
Первая проблема, которая заключается в том, почему ваш код завершается сбоем без вывода сообщений, связана с ваш BinaryTree.add
метод, который ничего не делает, когда дерево пусто. Проблема состоит в том, что вы инициализируете локальную переменную val
равной вашему root узлу (если он у вас есть), а затем позже привязываете ее к другому значению. Но это никогда не меняет значение root, только локальную переменную val
.
Я предлагаю вам избавиться от val
все вместе, а вместо этого читать и писать self.root
напрямую. Тогда вы действительно добьетесь некоторого прогресса и увидите другие проблемы.
Вот начало:
def add(self, value):
if self.root is None:
self.root = value
elif self.root.left.left is None:
self.root.left = value
...
Другие упомянутые мной проблемы похожи, хотя одна встречается в BinaryTree.add
а другой в BinaryTree.preorder
. Проблема в том, что вы пытаетесь вызвать один и тот же метод (add
или preorder
) на одном из дочерних элементов вашего root узла. Но узлы являются Node
экземплярами и не имеют методов, которые вы определили в классе BinaryTree
.
Эта проблема не имеет такого очевидного решения, как предыдущий. Одна идея может состоять в том, чтобы переместить логи c для методов в класс Node
(где вы можете легко выполнить рекурсию) и оставить только код обработки пустого дерева в методах BinaryTree
(все остальное делегируется root узел).