Leetcode-572、另一个树的子树
题解1
错误解答
// 思路
// 1、以当前节点s,t比较/s.left和t比较/s.right和t比较/s和t.left比较/s和t.right比较
// 2、递归终止,两个不为空,比较值/一个为空,一个不为空/两个为空
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s == null || t == null) {
return false;
}
if (s.val == t.val) {
return isSubtree(s.left, t.left) && isSubtree(s.right, t.right);
} else {
return isSubtree(s.left, t) || isSubtree(s.right, t) || isSubtree(s, t.left) || isSubtree(s, t.right);
}
}
}
badcase-1
树s
树t
结果
题解2
修正
题目为s是否包含t,而不是(s是否包含t,t是否包含s)
// 思路
// 1、以当前节点s,t比较/s.left和t比较/s.right和t比较
// 2、递归终止,两个不为空,比较值/一个为空,一个不为空/两个为空
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s == null && t != null) {
return false;
}
if (s != null && t == null) { //
return false;
}
if (s.val == t.val) {
return isSubtree(s.left, t.left) && isSubtree(s.right, t.right);
} else {
return isSubtree(s.left, t) || isSubtree(s.right, t);
}
}
}
badcase-2
但是修正之后的代码对于badcese-1判断正确,但是badcase-2不正确
分歧在于s!=null而t==null
好容易错的思路啊
// 思路
// 逻辑1:是否是子树,是否包含的关系
// 逻辑2:是否相同
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s != null && t == null) {
return false;
}
if (s == null && t != null) {
return false;
}
if (s.val == t.val) {
return isSametree(s.left, t.left) && isSametree(s.right, t.right);
} else {
return isSubtree(s.left, t) || isSubtree(s.right, t);
}
}
private boolean isSametree(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s == null || t == null) {
return false;
}
if (s.val != t.val) {
return false;
}
return isSametree(s.left, t.left) && isSametree(s.right, t.right);
}
}
正确题解
注意1: 两种逻辑,包含关系、相等关系的不同之处
注意2: if-else之处
// 思路
// 逻辑1:是否是子树,是否包含的关系, s为空时,一定为false,t为空时,一定为true
// 逻辑2:是否相同,s不为空、t为空时,是false(与逻辑1不同)
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
// 注意1,包含关系和相等关系的不同之处,s不为空、t为空时
if (t == null) {
return true;
}
if (s == null) {
return false;
}
// 注意2:不是if-else的关系
// if (s.val == t.val) {
// return isSametree(s.left, t.left) && isSametree(s.right, t.right);
// } else {
// return isSubtree(s.left, t) || isSubtree(s.right, t);
// }
// 实现1
// boolean res = false;
// if (s.val == t.val) {
// res = isSametree(s.left, t.left) && isSametree(s.right, t.right);
// }
// return res || isSubtree(s.left, t) || isSubtree(s.right, t);
// 实现2
return isSametree(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
}
private boolean isSametree(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s == null || t == null) {
return false;
}
if (s.val != t.val) {
return false;
}
return isSametree(s.left, t.left) && isSametree(s.right, t.right);
}
}
https://leetcode-cn.com/problems/subtree-of-another-tree/solution/dui-cheng-mei-pan-duan-zi-shu-vs-pan-duan-xiang-de/
关于细节
探讨包含关系和相等关系的不同之处
实现1、实现2、实现3都可以正确通过,其实题目交代了s和t都为非空,所以isSubtree在递归过程中,s可能为空,但t不会为空。
不会出现以下情况:
1、s == null && t == null
2、s != null && t == null
t一定是不为空的
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
// 实现1
// if (t == null) {
// return true;
// }
// if (s == null) {
// return false;
// }
// 实现2
// if (s == null && t == null) {
// return true;
// }
// if (s == null && t != null) {
// return false;
// }
// if (s != null && t == null) { // ??? true或者false都是可以通过的
// return false;
// }
// 实现3
if (s == null && t != null) {
return false;
}
return isSametree(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
}
private boolean isSametree(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s == null || t == null) {
return false;
}
if (s.val != t.val) {
return false;
}
return isSametree(s.left, t.left) && isSametree(s.right, t.right);
}
}