Python自定义TreeNode树结构调用__str__打印时报TypeError求解
报错原因
核心错误来自addchildren方法的错误实现:代码中向children列表追加的是TreeNode.data(即字符串类型的节点值),而非TreeNode节点对象本身。遍历children时拿到的是字符串,字符串内置的__str__方法不接受任何入参,调用时传入level+1就会触发TypeError。
额外存在一个可优化的风险点:__init__方法使用可变列表[]作为默认参数,Python中函数的默认参数在定义时初始化,所有类实例会共享同一个列表对象,可能出现非预期的节点共享问题。
修复后的完整代码
class TreeNode: def __init__(self, data, children=None): self.data = data self.children = children if children is not None else [] def __str__(self, level=0): ret = " " * level + str(self.data) + '\n' for child in self.children: ret += child.__str__(level+1) return ret # 为树节点添加子节点 def addchildren(self, node): self.children.append(node) drinks = TreeNode('Drinks') cold = TreeNode('Cold') hot = TreeNode('Hot') cola = TreeNode('Cola') cappucino = TreeNode('Cappucino') drinks.addchildren(cold) drinks.addchildren(hot) cold.addchildren(cola) hot.addchildren(cappucino) print(drinks)
运行后即可输出你期望的缩进树结构:
Drinks Cold Cola Hot Cappucino
__str__方法逻辑解释 - 方法定义的
level=0是当前节点的缩进层级参数,默认值0对应根节点,不需要前置缩进。 - 方法首先生成当前节点的打印行:用
" " * level生成对应数量的缩进空格,拼接当前节点的data值和换行符,作为初始返回内容。 child.__str__(level+1)为递归调用逻辑:遍历到子节点时,传入level+1作为子节点的缩进层级,保证子节点比父节点多1个单位的缩进,符合树结构的层级展示规则,再把子节点返回的字符串拼接到当前内容后。- 最终递归完成后,返回所有层级拼接完成的完整树结构字符串,供
print()方法直接输出。
内容的提问来源于stack exchange,提问作者Malay Jeena
相关产品推荐
相关产品推荐

