题目描述
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
示例 1:
给定的树 s:
给定的树 t:
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
示例 2:
给定的树 s:
给定的树 t:
返回 false。
代码
public class Solution {
public boolean isSubtree(TreeNode s,TreeNode t){
/*
* equals方法检查以s和t为根的两棵子树是否相等
* isSubtree递归检查t是否存在于s的左或右子树中;
* 又或者以s为根的这棵树就是与以t为根的那棵树相等的树,使用equals检查即可。
*/
if(s == null && t!=null){
//递归进行到s为空,返回false
return false;
}
boolean isSubInLeft = isSubtree(s.left,t);
boolean isSub = equals(s,t);//检查当前结点s是否可以和子树t匹配
boolean isSubInRight = isSubtree(s.right,t);
if(isSubInLeft || isSub || isSubInRight){
return true;
}
return false;
}
public boolean equals(TreeNode s,TreeNode t){
if(s == null && t == null){
//比较到最下部
return true;
}else if(s == null || t == null){
//两者中只有一者为空,必然不等,处理t是s“子树中的一部分”,即示例2的情况
return false;
}
if(s.val == t.val){
boolean resOfLeft = equals(s.left,t.left);
boolean resOfRight = equals(s.right,t.right);
if(resOfLeft && resOfRight){
//两孩子结点相等
return true;
}
}
//除以上情况外的其它情况,返回false
return false;
}
}
性能表现