树与图简单1 种解法

#572另一棵树的子树

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

#二叉树#深度优先搜索

解题主线

01

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

解法 1枚举根并比较

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

时间复杂度

O(nm) 最坏,n、m 分别为两棵树节点数

空间复杂度

O(h1 + h2) 最坏

572. 另一棵树的子树 · 枚举根并比较
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) {
        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