You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地实现LeetCode相同树解法遇TypeError,求问题原因与修复方案

问题分析与修复方案

问题原因

  1. 实例方法调用错误:isSameTree是Solution类的实例方法,必须先创建Solution的实例才能调用。你直接用Solution.isSameTree(...)调用时,Python会把第一个列表参数当成self(实例方法的第一个必填参数),导致原本的q参数缺失,触发TypeError。
  2. 参数类型不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:40:33