题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subtree-of-another-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
给定两个非空二叉树 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。
这个题,看到树首先想到的就是递归吧,哈哈哈哈哈,关于树的题,首先想到就是递归。
题目要判断 t 是否为 s 的子树
那么符合题意的情况应该就有:
- s树和t树本来就相等
- s树的子树和t树相等,这其中,又分为 s的左子树/右子树和t相等,,或者是 s 的左(右)子树的左(右)子树…和t相等
对于第一种情况,我们做一次判断就行了
对于第二种情况,我们需要递归做多次判断
那么如何判断两棵树是否相等呢,,这里我们还是用到递归,如果每一个结点都相等,那么这两棵树必然相等。
先看看判断两棵树是否相等的代码:
/**
* 判断两棵树是否相等
* @param s
* @param t
* @return
*/
public boolean isIdentical(TreeNode s, TreeNode t){
//如果两棵树都为空,那么这两棵树必然相等,直接返回true
if (s == null && t==null){
return true;
}
//如果只有其中一个为空,那么两棵树不相等,直接返回false
if (s == null || t == null){
return false;
}
//如果当前结点对应的值不等,那么两棵树不等,返回false
if (s.val != t.val){
return false;
}
//递归判断s的左子树和t的左子树是否相等 和 s的右子树和t的右子树是否相等
return isIdentical(s.left, t.left) && isIdentical(s.right, t.right);
}
接下来再看判断t是否为s的子树的代码:
/**
* 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。
* s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
* @param s
* @param t
* @return
*/
public boolean isSubtree(TreeNode s, TreeNode t) {
//如果t是空,那么它是任何树的子树
if (t == null) {
return true;
}
//如果t不为空,但是s为空,那么必定返回false
if (s == null) {
return false;
}
//判断s与t是否相等
//或者递归判断 t是否为s的左子树的子树 或 t是否为s的右子树的子树
return isSubtree(s.left, t)||isSubtree(s.right, t)||isIdentical(s, t);
}