本地实现LeetCode相同树解法遇TypeError,求问题原因与修复方案
问题分析与修复方案
问题原因
- 实例方法调用错误:
isSameTree是Solution类的实例方法,必须先创建Solution的实例才能调用。你直接用Solution.isSameTree(...)调用时,Python会把第一个列表参数当成self(实例方法的第一个必填参数),导致原本的q参数缺失,触发TypeError。 - 参数类型不匹配:
isSameTree要求传入TreeNode类型的实例,但你直接传了普通列表,代码无法处理这种类型的参数。
修复步骤
1. 添加列表转TreeNode的辅助函数
LeetCode的测试用例是层序遍历的列表格式,我们需要一个辅助函数把列表转换成对应的二叉树结构:
from typing import Optional, List import collections def build_tree(nodes: List[Optional[int]]) -> Optional[TreeNode]: if not nodes: return None root = TreeNode(nodes[0]) queue = collections.deque([root]) idx = 1 while queue and idx < len(nodes): current = queue.popleft() # 处理左子节点 if idx < len(nodes) and nodes[idx] is not None: current.left = TreeNode(nodes[idx]) queue.append(current.left) idx += 1 # 处理右子节点 if idx < len(nodes) and nodes[idx] is not None: current.right = TreeNode(nodes[idx]) queue.append(current.right) idx += 1 return root
2. 正确调用实例方法
先创建Solution类的实例,再调用isSameTree方法,同时用辅助函数把列表转成TreeNode实例:
# 原TreeNode和Solution类代码保持不变 if __name__ == "__main__": # 把列表转成TreeNode tree1 = build_tree([1,2,3]) tree2 = build_tree([1,2,3]) # 创建Solution实例并调用方法 sol = Solution() print(sol.isSameTree(tree1, tree2)) # 输出True
3. 完整修复后的代码
from typing import Optional, List import collections class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def build_tree(nodes: List[Optional[int]]) -> Optional[TreeNode]: if not nodes: return None root = TreeNode(nodes[0]) queue = collections.deque([root]) idx = 1 while queue and idx < len(nodes): current = queue.popleft() if idx < len(nodes) and nodes[idx] is not None: current.left = TreeNode(nodes[idx]) queue.append(current.left) idx += 1 if idx < len(nodes) and nodes[idx] is not None: current.right = TreeNode(nodes[idx]) queue.append(current.right) idx += 1 return root class Solution: def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool: if not p and not q: return True elif (p and not q) or (q and not p): return False return ( self.isSameTree(p.left, q.left) and (p.val == q.val) and self.isSameTree(p.right, q.right) ) if __name__ == "__main__": tree1 = build_tree([1,2,3]) tree2 = build_tree([1,2,3]) sol = Solution() print(sol.isSameTree(tree1, tree2))
额外说明
如果不想创建实例,也可以把isSameTree改成类方法,在方法上加上@classmethod装饰器,此时调用可以用Solution.isSameTree(...),但这种写法不符合LeetCode原题的方法定义,更推荐用实例调用的方式。
内容的提问来源于stack exchange,提问作者Chungji
相关产品推荐
相关产品推荐

