Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
572. 另一棵树的子树 - 力扣(LeetCode) (leetcode-cn.com)
给你两棵二叉树 root 和 subRoot 。检验 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]
- -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;
}
}