我试图编写一个使用递归来查找节点数的函数,即二叉树的大小。如果树为空,则没有节点。如果它不为空,则节点数为1(根)加上左子树的节点数和右子树的节点数。
我打算使用给我的二叉树类来做这件事。
这是我的Binary Tree类:
class BinaryTree:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def insert_left(self, new_data):
if self.left == None:
self.left = BinaryTree(new_data)
else:
t = BinaryTree(new_data)
t.left = self.left
self.left = t
def insert_right(self, new_data):
if self.right == None:
self.right = BinaryTree(new_data)
else:
t = BinaryTree(new_data)
t.right = self.right
self.right = t
def get_left(self):
return self.left
def get_right(self):
return self.right
def set_data(self, data):
self.data = data
def get_data(self):
return self.data
这是我计算大小的递归函数:
def size(my_tree):
count = 0
if my_tree.get_data() is None:
return 0
else:
count += 1 + size(my_tree.get_left()) + size(my_tree.get_right())
return count
然而,当我用这个程序运行它时:
a = BinaryTree(1)
a.insert_left(2)
a.insert_right(3)
print(size(a))
我收到以下错误:
Original exception was:
Traceback (most recent call last):
File "prog.python3", line 57, in <module>
print(size(a))
File "prog.python3", line 41, in size
count += 1 + size(my_tree.get_left()) + size(my_tree.get_right())
File "prog.python3", line 38, in size
if my_tree.get_data() is None:
AttributeError: 'NoneType' object has no attribute 'get_data'
输出时应为:
3
我根本不理解我做错了什么,但我很确定它必须与if语句有关。
答案 0 :(得分:1)
只需将您的if
声明修改为
if my_tree is None:
return 0
由于您尝试在递归调用二叉树的叶节点时访问get_data
数据对象的NULL
属性,因此出现错误。
相反,当您到达return 0
节点时,您实际需要做的是NoneType
。
答案 1 :(得分:0)
如果my_tree
为无,会发生什么?然后,您无法拨打get_data()
...
试试这个
if my_tree is None:
return 0
值得指出的是,您并不关心节点数据以查找树的大小
更优化的方法是不递归,并在插入/删除元素时保持大小更新
答案 2 :(得分:0)
假设您传入了一个有效的root
对象,并且按预期发生了递归,那么您可以在什么时候遇到NoneType
错误?当然,当my_tree
为None
时,您尝试访问None
的属性。什么时候my_tree
可以None
?在树叶。换句话说,您的基本案例格式不正确。
请注意,测试get_data
的返回值在这里完全是多余的,因为self.data
与节点的高度或节点本身无关。
def size(my_tree):
if not my_tree:
return 0
return 1 + size(my_tree.get_left()) + size(my_tree.get_right())
进一步的挑剔:
else
;这是控制流程所暗示的。return
之外您不做任何其他操作。答案 3 :(得分:0)
您收到此错误是因为您在不存在的对象上调用get_data()。因此,您在NoneType对象上调用 get_data()。
def size(my_tree):
count = 0
if my_tree is None:
return 0
count += 1 + size(my_tree.get_left()) + size(my_tree.get_right())
return count
不需要else子句。计算二叉树节点的另一个建议是在类上有一个属性size
,并在从树中添加/删除项目时增加/减少它。