执行二叉树代码时发生TypeError

2024-04-25 01:23:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我在测试以下函数时出错。有人能帮我吗

代码:

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'

请告诉我为什么会这样


1条回答
网友
1楼 · 发布于 2024-04-25 01:23:04

由于您的largest_leaf_value将在其递归基本情况下返回None,因此您需要准备好让lresrres获得分配给它们的None

类型错误发生在将lresrresres进行比较的行上,它告诉您None值不能与res进行比较

因此有两种可能:要么避免在lresrresNone时执行比较,要么不要让函数返回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))
    )

相关问题 更多 >