刷题日记 572. 另一棵树的子树

119 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

572. 另一棵树的子树 - 力扣(LeetCode) (leetcode-cn.com)

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

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

 

示例 1:

image.png

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

示例 2:

image.png

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

提示:

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

二、思路分析:

使用比较法 首先需要一个辅助函数helper用于判断两树是否完全相同。然后对s树进行遍历,当遇到与t树根节点相等的节点时,调用helper判断当前子树与t树是否完全相同,相同则返回true,不同则继续递归遍历剩下所有节点。

三、AC 代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        if(t==null)
            return true;
        if(s==null)
            return false;
        if(s.val==t.val&&helper(s,t)) 
            return true;
        else 
            return isSubtree(s.left,t)||isSubtree(s.right,t);
    }
    public boolean helper(TreeNode s, TreeNode t){
        if(s==null&&t==null) 
            return true;
        if(s!=null&&t!=null&&s.val==t.val){
            return helper(s.left,t.left)&&helper(s.right,t.right);
        }
        return false;
    }
}