力扣第112题-路径总和

138 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

前言

力扣第112题 路径总和 如下所示:

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:

输入: root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出: true
解释: 等于目标和的根节点到叶节点路径如上图所示。

示例 2:

输入: root = [1,2,3], targetSum = 5
输出: false
解释: 树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

一、思路

这一题与上一题非常的类似,都是与数中的叶子节点相关。

我的思路也是非常简单的,总共就分为两个步骤:

  1. 通过递归,找到所有从根节点出发到叶子节点路径上的和
  2. 遍历所有路径和的列表,如果有目标值则返回 true,反之返回 false

后面我提交的时候发现击败率只有 20% 左右,我就看了一下官方的题解。发现可以在递归的过程中,直接判断 根节点到叶子节点的路径和是否满足条件,只要在递归的过程中出现了一条满足条件的路径,则提前结束遍历。

不难看出官方题解的方式确实是又快又好,代码步骤很少,简单易懂。但既然是以学习为目的,我在这里也详细描述一下我的思路。

图解算法

我们还是以下图的树作为例子,目标值 target38

image.png

1. 找到所有根节点到叶子节点的路径和,总共有三条如下所示:

第一条:3 -> 9 -> 1 路径和为 13

image.png

第二条:3 -> 20 -> 15 路径和为 38

image.png

第三条:3 -> 20 -> 7 路径和为 30

image.png

2. 遍历路径和的列表,看是否有目标值 38

很显然列表中包含了目标值 38,故直接返回 true 即可。

二、实现

实现代码

实现代码与思路中保持一致,但是有一点长。

    public boolean hasPathSum(TreeNode root, int targetSum) {
        List<Integer> ret = new ArrayList<>();
        allNodePathRet(ret, root, 0);
        for (int val : ret){
            if (val == targetSum)
                return true;
        }
        return false;
    }

    /**
     * 找到所有路径和
     */
    public void allNodePathRet(List<Integer> list, TreeNode root, int pathVal){
        if (root == null)
            return;
        pathVal += root.val;    // 加上当前节点的值
        if (root.left == null && root.right == null){   // 叶子节点
            list.add(pathVal);
        }
        if (root.left != null){
            allNodePathRet(list, root.left, pathVal);
        }
        if (root.right != null){
            allNodePathRet(list, root.right, pathVal);
        }
    }

测试代码

    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(1, new TreeNode(2), null);
        new Number112().hasPathSum(treeNode, 1);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~