class Node:
rChild,lChild,data = None,None,None
Это неправильно - это делает ваши переменные переменными класса - то есть каждый экземпляр Node использует одни и те же значения (изменение rChild любого узла изменяет его для всех узлов!). Это явно не то, что вы хотите; попробовать
class Node:
def __init__(self, key):
self.rChild = None
self.lChild = None
self.data = key
теперь у каждого узла есть свой набор переменных. То же самое относится к вашему определению дерева,
class Tree:
root,size = None,0 # <- lose this line!
def __init__(self):
self.root = None
self.size = 0
Кроме того, каждый класс должен быть классом "нового стиля", производным от класса "объект" и должен возвращаться к объекту .__ init __ ():
class Node(object):
def __init__(self, data, rChild=None, lChild=None):
super(Node,self).__init__()
self.data = data
self.rChild = rChild
self.lChild = lChild
class Tree(object):
def __init__(self):
super(Tree,self).__init__()
self.root = None
self.size = 0
Кроме того, main () имеет слишком большой отступ - как показано, это метод дерева, который нельзя вызвать, потому что он не принимает аргумент self .
Кроме того, вы изменяете данные объекта напрямую (t.root = Node(4)
), что разрушает инкапсуляцию (прежде всего, наличие классов); вы должны делать что-то более похожее на
def main():
t = Tree()
t.add(4) # <- let the tree create a data Node and insert it
t.add(5)