计算二叉树中的路径

时间:2018-07-12 03:22:17

标签: python python-3.x

您好,我在这段代码中尝试计算二进制树(数据结构)中的路径。但是在某些情况下,它会给我一个错误,说 “ 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'

1 个答案:

答案 0 :(得分:1)

该异常会准确告诉您出了什么问题。节点的left之一是整数而不是BTNode(根据您的类型,注解是leftright的含义)。

这里的问题是BTNode(None, 1, 5)。这是使用BTNodeitem = Noneleft = 1创建一个right = 5leftright必须为BTNodes。所以代替:

tree = BTNode(None, BTNode(None, 1, 5), BTNode(8))

尝试:

tree = BTNode(None, BTNode(None, BTNode(1), BTNode(5)), BTNode(8))

关于将来如何防止这种情况的一些想法:

请注意,类型注释在Python中是可选的,并且不由解释器强制执行。如果要检查程序是否键入正确,则需要在代码库上运行mypy。它将出于以下几个原因进行投诉:

  1. BTNode(None, 1, 5)-因为15不是BTNode
  2. leftright的类型必须为Optional[BTNode],因为它们可以是Nonefrom typing import Optional

如果您使用命名的args构造树,则可能更容易看到这一点:

tree = BTNode(item=None, left=BTNode(item=None, left=1, right=5), right=BTNode(8))

还应研究typing.Generic,以便在从item中提取BTNode时可以更多地利用类型系统(而不必进行不安全的强制转换)。