python - 执行二叉树代码时出现 TypeError
问题描述
测试以下功能时出现错误。有人可以帮我吗?
代码:
class treenode(object):
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
def largest_leaf_value(tnode):
if tnode is None:
return None
res = tnode.data
lres = largest_leaf_value(tnode.left)
rres = largest_leaf_value(tnode.right)
if lres > res:
res = lres
if rres > res:
res = rres
return res
这是测试脚本:
# test tree with 1 level i.e. root value only
input_tree = T.treenode(1)
expected = 3
result = a8q1.largest_leaf_value(input_tree)
assert result is expected, "{}: copying empty tree returned unexpected result".format(test_item)
# test a longer tree
input_tree = T.treenode(1, T.treenode(2, T.treenode(3, T.treenode(4, T.treenode(5)))))
expected = 5
result = a8q1.largest_leaf_value(input_tree)
assert result is expected, "{}: copying empty tree returned unexpected result".format(test_item)
这是我得到的错误:
Traceback (most recent call last):
File "D:/CMPT 145/Assignment 8/a8q1_testing.py", line 60, in <module>
result = a8q1.largest_leaf_value(input_tree)
File "D:\CMPT 145\Assignment 8\a8q1.py", line 44, in largest_leaf_value
if lres > res:
TypeError: '>' not supported between instances of 'NoneType' and 'int'
请让我知道为什么会这样?
解决方案
由于您largest_leaf_value
将None
在其递归基本案例中返回,您需要准备好lres
或被分配rres
给None
他们。
类型错误发生在您比较lres
或的行rres
上res
,并告诉您None
无法将值与 进行比较res
。
因此,您有两种可能性:要么避免在 whenlres
或rres
is执行该比较None
,要么不要让您的函数 return None
,而是返回 -infinity (因为该值小于所有其他有限数值)。
第一种方法的解决方案:
def largest_leaf_value(tnode):
if tnode is None:
return None
res = tnode.data
lres = largest_leaf_value(tnode.left)
rres = largest_leaf_value(tnode.right)
# Only compare when not None:
if lres is not None and lres > res:
res = lres
if rres is not None and rres > res:
res = rres
return res
第二种方法的解决方案:
def largest_leaf_value(tnode):
if tnode is None:
# Don't return None, but -infinity
return float("-inf")
res = tnode.data
lres = largest_leaf_value(tnode.left)
rres = largest_leaf_value(tnode.right)
if lres > res:
res = lres
if rres > res:
res = rres
return res
None
请注意,当您在初始调用中将空树(即)作为参数传递时,这将表现不同。从数学上讲,没有定义空集合中的最大值是多少,因此它将取决于您期望在这种情况下发生什么。
最后,您可以使用max()
使第二个版本更短一些:
def largest_leaf_value(tnode):
return (float("-inf") if tnode is None else
max(tnode.data, largest_leaf_value(tnode.left), largest_leaf_value(tnode.right))
)
推荐阅读
- android - android.arch.lifecycle:extensions:1.1.1 目录
- android - 我有一个错误,这是我的错误:确保首先调用 FirebaseApp.initializeApp(Context)
- docker - 所有依赖项都应该安装到 docker 映像吗?或者让它取决于主机
- powershell - PowerShell 在输出 CSV 中包含输入变量
- google-chrome - 无法从“https 服务器”上运行的 chrome pdf 查看器下载文件 PDF
- node.js - 在 Express js 中禁用所有控制台消息
- knockout.js - 从浏览器控制台获取 Knockout.js 的版本?
- json - 从 JSON 返回多个单元格
- sharepoint - 如何使用 Microsoft Flow 在 Sharepoint 的新文件夹中的新 Excel 文件中插入行
- django-allauth - Django 电子邮件验证 - 自定义电子邮件 html & 404 not found accounts/profile/