【LeetCode】Day28-路径总和

题目1

101. 对称二叉树【简单】

题解

以前做过,还是忘了…

如果同时满足下面的条件,两个树互为镜像:

  • 它们的两个根结点具有相同的值
  • 每个树的右子树都与另一个树的左子树镜像对称

递归

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return check(root,root);
    }
    public boolean check(TreeNode l,TreeNode r){
        if(l==null&&r==null)
            return true;
        if(l==null||r==null)
            return false;
        return l.val==r.val&&check(l.left,r.right)&&check(l.right,r.left);
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

迭代

用队列实现递归

class Solution {
    public boolean isSymmetric(TreeNode root) {
        Queue<TreeNode>queue=new LinkedList<>();
        queue.offer(root);
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode p=queue.poll();
            TreeNode q=queue.poll();
            if(p==null&&q==null)
                continue;
                
            if(p==null||q==null)
                return false;

            if(p.val!=q.val)
                return false;

            queue.offer(p.left);
            queue.offer(q.right);

            queue.offer(p.right);
            queue.offer(q.left);
        }
        return true;
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

题目2

112. 路径总和【简单】

题解

BFS

利用树的层次遍历,增加一个队列存储 根节点到对应结点的路径长度,到叶子结点的时候判断是否等于targetSum(注意不能提前判断,因为树的结点可能有负值)

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null)
            return false;
        Queue<TreeNode>queueTree=new LinkedList<>();//存储结点
        Queue<Integer>queueVal=new LinkedList<>();//存储到该节点的路径长度
        queueTree.offer(root);
        queueVal.offer(root.val);
        
        while(!queueTree.isEmpty()){
            TreeNode p=queueTree.poll();
            int sumTmp=queueVal.poll();
            //叶子节点
            if(p.left==null&&p.right==null){
                if(sumTmp==targetSum)
                    return true;
                continue;
            }
            //非叶子结点,继续遍历
            if(p.left!=null){
                queueTree.offer(p.left);
                queueVal.offer(p.left.val+sumTmp);
            }
            if(p.right!=null){
                queueTree.offer(p.right);
                queueVal.offer(p.right.val+sumTmp);
            }
        }
        return false;
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

递归

根节点到当前节点的值之和为 sum => 假定从根节点到当前节点的值之和为 val,是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val。

相当于 自顶(根)向下 转换为了 自底(叶子)向上

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null)
            return false;
        
        int leftSum=targetSum-root.val;//sum-val
        if(root.left==null&&root.right==null)
            return leftSum==0;
        
        //注意是"或"的关系,左右有一边就行
        return hasPathSum(root.left,leftSum)||hasPathSum(root.right,leftSum);
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

p.s. 过了个清明节,没想到就五天没更了,今天急事儿有点多,刷题拖到了晚上,先过道简单题,明天开始继续努力!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值