leetcode-简单题-572. 另一棵树的子树

https://leetcode-cn.com/problems/subtree-of-another-tree/submissions/
这个题目和100. 相同的树 的相似度比较像,既然子树的比较方法可以使用相同的树的递归,那么这道题目我称之为'递中递'
尽管知道了方法,也知道可能其中要使用到或运算,但最后还是写不出来,参考了大神的代码:
思路:

  1. 判断是否是相同的树这个用在单次递归里面的两个非空的头结点
  2. 然后以此递归到左,右
  3. 递归的结果做或运算,因为只要有一个成立,就是另一个子树。
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;       
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值