Вы на самом деле не добавляете какие-либо узлы в дерево!
Проще всего управлять добавлением корневого узла в явном виде, как вы видите ниже в insert
.
Функция find_place
будет, предположительно из имени, возвращать родительский узел, а также, будет ли это левый или правый слот для ключа? Я сделал явную функцию _do_insert
ниже, которая выполняет и вставку.
С этого момента вам нужно пройтись по дереву, каждый раз проверяя, нет ли у вас ответвления на ветке или вы достигли пустой ячейки, где вы добавляете новый узел.
Может быть естественным рефакторинг вашего кода, чтобы возложить ответственность за обход дерева (и выполнение операций добавления, удаления и т. Д.) В класс Node
.
В приведенном ниже коде я игнорирую добавление ключа, который уже находится в дереве, я просто молча завершаю работу:
def insert(self,t):
'''inserts a new element into the tree'''
if self.root is None:
self.root = Node(t)
else:
self._do_insert(self.root,t)
def _do_insert(self,parent,t):
if t > parent.key:
if parent.left is None:
parent.left = Node(t)
else:
self._do_insert(parent.left,t)
elif t < parent.key:
if parent.right is None:
parent.right = Node(t)
else:
self._do_insert(parent.right,t)
else:
# raise a KeyError or something appropriate?
pass