572. 另一个树的子树(Leetcode)

167 阅读1分钟

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

示例 1:

给定的树 s:
     3
    / \
   4   5
  / \
 1   2
 
给定的树 t:
   4 
  / \
 1   2
 
返回 true,因为 t  s 的一个子树拥有相同的结构和节点值。
复制代码
复制代码
示例 2:

给定的树 s:
     3
    / \
   4   5
  / \
 1   2
    /
   0
   
给定的树 t:
   4
  / \
 1   2
 
返回 false
复制代码
复制代码

题解:这道题让我们判断一棵树是否为另外一棵树的子树,子树必须是从某个节点开始,然后到叶子节点的,那么就可以转为比较两棵树是否相同的问题了,遍历其中一棵树s,判断以某个节点开始的树是否等于另外一棵树t。

public boolean isSubtree(TreeNode s, TreeNode t) {
    if (s == null) return false;
    return isSubtreeWithRoot(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
}

private boolean isSubtreeWithRoot(TreeNode s, TreeNode t) {
    if (t == null && s == null) return true;
    if (t == null || s == null) return false;
    if (t.val != s.val) return false;
    return isSubtreeWithRoot(s.left, t.left) && isSubtreeWithRoot(s.right, t.right);
}