如何借助preorder()和inorder()方法展示Python实现的BST?
解决BST遍历方法调用的参数错误问题
核心问题分析
你遇到的参数数量错误,本质是遍历方法(preorder/inorder)需要起始节点才能执行,但调用时未传递这个必要参数,结合作业约束,需调整调用逻辑与方法定义的匹配性。
修正方案
1. 方法定义的正确逻辑
preorder和inorder不能用self,但必须接收node参数作为遍历起始点(这是二叉树遍历的核心要求,作业约束未禁止接收此类参数)。同时BST类需维护根节点的实例属性(如self.root),这是二叉树类的常规设计,不属于违规。
2. 修正后的代码示例
class BST: def __init__(self): self.root = None # 保存树的根节点,必备 # 遍历方法接收node参数,无需self def preorder(node): if node is None: return [] # 前序遍历:根 -> 左 -> 右 return [node.value] + BST.preorder(node.left) + BST.preorder(node.right) def inorder(node): if node is None: return [] # 中序遍历:左 -> 根 -> 右 return BST.inorder(node.left) + [node.value] + BST.inorder(node.right) # display方法不能加额外参数,用self访问根节点 def display(self): # 用lambda封装遍历方法的调用,传入根节点参数 show_traversal = lambda f: print(f(self.root)) print("前序遍历结果:") show_traversal(BST.preorder) print("中序遍历结果:") show_traversal(BST.inorder)
3. 若遍历方法直接打印节点值
如果preorder/inorder是直接打印节点内容,调整如下:
def preorder(node): if node is not None: print(node.value, end=" ") BST.preorder(node.left) BST.preorder(node.right) def display(self): print("\n前序遍历:") show_traversal = lambda f: f(self.root) show_traversal(BST.preorder) print("\n中序遍历:") show_traversal(BST.inorder)
关键注意点
- 作业约束的"不能使用self"指方法不需要
self参数,而非禁止接收遍历必需的node参数; - display作为实例方法,本身可通过
self访问实例的根节点,这不属于违反"不能添加参数"的约束(约束指不能给display加额外自定义参数); - lambda调用时必须传递
self.root给遍历方法,补全必要参数,才能解决参数数量不匹配的错误。
内容的提问来源于stack exchange,提问作者selena
相关产品推荐
相关产品推荐

