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

为何Leetcode第100题相同树中中序遍历解法失效?

解决LeetCode 100题「相同树」的中序遍历误区

你的直觉确实有误,单一的中序遍历(或仅用前序/后序单遍历)无法唯一确定一棵二叉树,这就是你测试用例失败的核心原因。

测试用例失败分析

你遇到的测试用例:

  • p的树结构:根节点1,左子节点1,右子节点为空
  • q的树结构:根节点1,左子节点为空,右子节点1

这两棵树的中序遍历结果都是[1,1],所以你的代码会误判为相同,但它们的结构完全不同,因此预期输出为false。问题出在你的遍历逻辑没有记录空节点的信息,导致不同结构的树生成了相同的遍历序列。

你的代码存在的其他问题

除了遍历逻辑的缺陷,你的类成员变量plist和qlist会被LeetCode的批量测试复用,若不重置,前一次测试的结果会干扰后续测试,导致错误。

修正方案

方案1:改进遍历逻辑,记录空节点并重置容器

修改遍历方法,用特殊值(比如null)标记空节点,同时每次调用isSameTree时创建新的列表,避免跨测试用例污染:

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        List<Integer> plist = new ArrayList<>();
        List<Integer> qlist = new ArrayList<>();
        inorder(p, plist);
        inorder(q, qlist);
        return plist.equals(qlist);
    }

    public void inorder(TreeNode root, List<Integer> lst) {
        if (root == null) {
            lst.add(null); // 标记空节点
            return;
        }
        inorder(root.left, lst);
        lst.add(root.val);
        inorder(root.right, lst);
    }
}

方案2:更高效的递归直接判断(推荐)

无需额外存储遍历序列,直接递归比较节点的存在性和值,同时验证左右子树结构:

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        // 两个节点都为空,结构一致
        if (p == null && q == null) return true;
        // 仅一个节点为空,结构不一致
        if (p == null || q == null) return false;
        // 当前节点值相同,递归比较左右子树
        return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
}

关键结论

如果想用遍历方式判断两棵树是否相同,必须同时记录节点值和空节点的位置,否则不同结构的树可能生成相同的遍历序列。另外,要注意避免测试用例之间的状态污染,不要使用类成员变量存储临时遍历结果。

内容的提问来源于stack exchange,提问作者Lily

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:32:41