您好,我在这段代码中尝试计算二进制树(数据结构)中的路径。但是在某些情况下,它会给我一个错误,说 “ AttributeError:'int'对象没有属性'left'” 我该如何解决这个问题? 例如在这种情况下
tree = BTNode(None, BTNode(None,1, 5), BTNode(8))
我将遇到属性错误。
class BTNode:
"""A node in a binary tree."""
def __init__(self: 'BTNode', item: object,
left: 'BTNode' =None, right: 'BTNode' =None) -> None:
"""Initialize this node.
"""
self.item, self.left, self.right = item, left, right
def __repr__(self):
return 'BTNode({}, {}, {})'.format(self.item, str(self.left),
str(self.right))
def tree_paths(t: BTNode) -> int:
'''Return number of paths to get from root of t,
to all houses, and back to t.
>>> tree_paths(BTNode(None, BTNode(4), BTNode(5)))
4
'''
ll = 0
rl = 0
if t is None:
return -2
if t.left is not None and t.left != int:
ll = tree_paths(t.left) + 2
if t.right is not None and t.right != int:
rl = tree_paths(t.right) + 2
return ll + rl
我看到的错误是:
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
tree_paths(t)
File "C:\Users\ma\Desktop\CSC148\lab7\trick.py", line 60, in tree_paths
ll = tree_paths(t.left) + 2
File "C:\Users\ma\Desktop\CSC148\lab7\trick.py", line 60, in tree_paths
ll = tree_paths(t.left) + 2
File "C:\Users\ma\Desktop\CSC148\lab7\trick.py", line 59, in tree_paths
if t.left is not None and t.left != int:
AttributeError: 'int' object has no attribute 'left'
答案 0 :(得分:1)
该异常会准确告诉您出了什么问题。节点的left
之一是整数而不是BTNode
(根据您的类型,注解是left
和right
的含义)。
这里的问题是BTNode(None, 1, 5)
。这是使用BTNode
,item = None
和left = 1
创建一个right = 5
。 left
和right
必须为BTNodes
。所以代替:
tree = BTNode(None, BTNode(None, 1, 5), BTNode(8))
尝试:
tree = BTNode(None, BTNode(None, BTNode(1), BTNode(5)), BTNode(8))
关于将来如何防止这种情况的一些想法:
请注意,类型注释在Python中是可选的,并且不由解释器强制执行。如果要检查程序是否键入正确,则需要在代码库上运行mypy。它将出于以下几个原因进行投诉:
BTNode(None, 1, 5)
-因为1
和5
不是BTNode
left
和right
的类型必须为Optional[BTNode]
,因为它们可以是None
(from typing import Optional
)如果您使用命名的args构造树,则可能更容易看到这一点:
tree = BTNode(item=None, left=BTNode(item=None, left=1, right=5), right=BTNode(8))
还应研究typing.Generic,以便在从item
中提取BTNode
时可以更多地利用类型系统(而不必进行不安全的强制转换)。