【发布时间】:2020-04-20 13:52:45
【问题描述】:
该类应基于后缀字符串生成解析树,然后在根节点上递归调用打印函数以打印解析树,但我不断收到以下错误:第 15 行, 在中缀打印节点 self.right.infixPrintNode() AttributeError: 'NoneType' 对象没有属性 'infixPrintNode'
我是 python 新手,我认为错误与实例相关,我真的很困惑,希望能得到一些澄清
import operator
class Node:
def __init__(self, data, left=None, right=None):
self.data, self.left, self.right = data, left, right
def __str__(self):
return self.data
def infixPrintNode(self):
if self:
if self.right:
return self.right.infixPrintNode()
print(self.data)
if self.left:
return self.left.infixPrintNode()
class ParseTree:
def __init__(self, root = None):
self.root = (root)
def __str__(self):
pass # to be implemented
def fromPostfix(self, expression=""):
s=[] #maintain parents
for c in expression.split():
if c in ["+", "-", "*", "/", "^", "#"]:
n=Node(c)
n.right = s.pop()
n.left=s.pop()
s.append(n)
elif c.isnumeric() or c.isalpha() :
n=Node(c)
s.append(n)
else:
raise ValueError("Invalid token! ")
self.root = (s.pop())
print(self.root.left.data)
print(self.root.data)
print(self.root.right.data)
return self.root #or Node(s.pop())
def printinfix(self):
if self.root:
self.root.infixPrintNode()
t=ParseTree("x y +")
t.fromPostfix("x y +")
t.printinfix()
【问题讨论】:
-
快速查看您的代码可以看出,您只使用一个参数实例化您的
Node类,self.left和self.right默认为None -
您还可以在它之后立即用
self.root = Node(s.pop())实例化一个新的Node实例。这意味着self.root没有self.left和self.right属性。 -
@misu:从错误消息中可以明显看出,您有一个
node,其right属性为None。如果你想调试你的程序,你需要弄清楚它是如何发生的。否认它是可能的对你没有帮助。 -
@misu 您的主要问题在于
self.right.infixPrintNode()。在某些时候,您的self.right属性将没有self.right属性,除非您有无限的Nodes。以您的elif块中的n=Node(c)为例。在您的示例中,它将在到达将它们分配给self.left和self.right的点之前两次到达此点。这意味着这两个实例都没有self.left和self.right属性。 -
@Misu 那是因为您正在返回
self.right.infixPrintNode()而不仅仅是调用它。如果您return将永远不会到达您的print(self.data)或self.left.infixPrintNode()对于您的第一个案例。
标签: python python-3.x oop parsing tree