我无法理解为什么我的根节点被设置为None。以下是树实现的一部分。
class Node(object):
def __init__(self, d=None):
self.left = None
self.right = None
self.data = d
class Tree(object):
root = Node()
#methods to add data to to the binary search tree
def add(self, d):
node_to_add = Node(d)
if self.root is None:
self.root.data = node_to_add
self._traverse_and_add(self.root, node_to_add)
def _traverse_and_add(self, node, new_node):
if new_node.data < node.data:
if node.left is None:
node.left = new_node
else:
self._traverse_and_add(node.left, new_node)
elif new_node.data > node.data:
if node.right is None:
node.right = new_node
else:
self._traverse_and_add(node.right, new_node)
当我在调试器中运行代码时,它显示我的根是None。在我的add方法中,我检查root是否为None,如果是,我希望root.data取值d。在根填充后它不是无,然后它可以相应地添加数据。我在Java中使用类似的方法我没有这个问题。此错误成为后续方法的问题,例如查找深度。如果我使用填充树
,这是我得到的视觉效果t = Tree()
t.add(10)
t.add(2)
t.add(11)
result =
None
/\
2 10
\
11
expected =
10
/\
2 11
答案 0 :(得分:2)
问题在于 -
if self.root is None:
self.root.data = node_to_add
在add()
功能中,您正在检查root
是否为空,但您甚至可能无法在root
内创建self
属性。
我猜你没有__init__
功能。您需要__init__
函数,其代码如下 -
def __init__(self):
self.root = None
您还需要更改添加功能,如下所示 -
def add(self, d):
node_to_add = Node(d)
if self.root is None:
self.root = node_to_add
self._traverse_and_add(self.root, node_to_add)
答案 1 :(得分:1)
您已将root
设为Node()
:
class Tree(object):
root = Node()
但是在这里你检查它是None
:
def add(self, d):
node_to_add = Node(d)
if self.root is None: # it is not None, it is Node()
此外,您没有任何__init__
方法。您应该在那里定义实例变量。
def __init__(self):
self.root = Node()
所以,现在你可以修改你:if self.root.data is None