https://leetcode-cn.com/problems/subtree-of-another-tree/submissions/
这个题目和100. 相同的树 的相似度比较像,既然子树的比较方法可以使用相同的树的递归,那么这道题目我称之为'递中递'
。
尽管知道了方法,也知道可能其中要使用到或运算
,但最后还是写不出来,参考了大神的代码:
思路:
- 判断是否是相同的树这个用在单次递归里面的两个非空的头结点
- 然后以此递归到左,右
- 递归的结果做
或运算
,因为只要有一个成立,就是另一个子树。
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (t == null) return true; // t 为 null 一定都是 true
if (s == null) return false; // 这里 t 一定不为 null, 只要 s 为 null,肯定是 false
return isSubtree(s.left, t) || isSubtree(s.right, t) || isSameTree(s,t);
}
/**
* 判断两棵树是否相同
*/
public 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);
}
}
作者:kelly2018
链接:https://leetcode-cn.com/problems/subtree-of-another-tree/solution/java-di-gui-ban-by-kelly2018/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
// 遇到这种有重复比较中左右的树类型题目,应该可以用递归
// 处理逻辑有“或”
// 传入参数:两个树的头结点
// 终止条件:头结点有一个是空的,false;头结点都是空的,返回ture;头结点不一样,返回false;头结点一样,返回true;
// 处理逻辑:比较左右子树是否一样;
// 比较大树的左子树和subRoot;
// 比较大树的右子树和subRoot;
class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
//比较顺序:中->左右
if(root == null && subRoot == null) return true;
if(root != null && subRoot == null) return false;
if(root == null && subRoot != null) return false;
//从这里开始,已经排除完空节点了,所以可以从两个树的头结点开始比较了
return isSametree(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}
public boolean isSametree(TreeNode left, TreeNode right){
if(left == null && right == null) return true;
else if(left != null && right == null) return false;
else if(left == null && right != null) return false;
else if(left.val != right.val) return false;
boolean left1,right1;
left1 = isSametree(left.left, right.left);
right1 = isSametree(left.right, right.right);
boolean res = left1 && right1;
return res;
}
}