原题
树与图简单1 种解法

#572另一棵树的子树

判断 subRoot 是否与 root 的某个节点为根的整棵子树完全相同。

#二叉树#深度优先搜索

原题

给你两棵二叉树 rootsubRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

示例 1:

输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

示例 2:

输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false

提示:

  • root 树上的节点数量范围是 [1, 2000]
  • subRoot 树上的节点数量范围是 [1, 1000]
  • -104 <= root.val <= 104
  • -104 <= subRoot.val <= 104

查看原题

解题主线

  1. 在 root 的每个候选节点上调用“相同的树”比较。

解法 1:枚举根并比较

当前节点匹配失败后,递归尝试左右子树作为候选根。

  • 时间复杂度: O(nm) 最坏,n、m 分别为两棵树节点数

  • 空间复杂度: O(h1 + h2) 最坏

JAVA
import java.util.*;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}

class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        // 外层递归枚举 root 的每个节点作为候选子树根。
        // 候选命中要求值与左右结构同时完全一致,而非只匹配节点序列。
        // 空目标树视为任意树的子树;非空目标无法匹配空主树。
        if (subRoot == null) return true;
        if (root == null) return false;
        return same(root, subRoot)
                || isSubtree(root.left, subRoot)
                || isSubtree(root.right, subRoot);
    }

    private boolean same(TreeNode first, TreeNode second) {
        if (first == null || second == null) return first == second;
        return first.val == second.val
                && same(first.left, second.left)
                && same(first.right, second.right);
    }
}

边界与易错点

  • 匹配要求结构和值都相同,不是只包含目标节点序列。
  • 约定空树是任意树的子树可让辅助方法语义完整。

整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

  • leetcode/src/main/java/tree/Q572_isSubTree.java