前端算法小白攻略34-leetcode(路径总和)

147 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战

前言

前两天,我们把链表相关的题目稍微复习下,有些重复的题型,比如说环形链表、分隔链表、链表反转更多的内容大家可以看下我最开始的算法题攻略,今天我们继续二叉树相关的算法题练习。

题目描述

112. 路径总和

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

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

前置知识点

image.png

如上图所见,这是一颗二叉树,根节点为顶端的5节点,最下面4种颜色代表没有子节点的叶子节点,题目中所提到的路径就是从根节点遍历到叶子节点的路径,我们图中这颗二叉树有4条路径,有几个叶子节点就有几条路径

解题思路

题目所给条件: 二叉树的根节点root、一个目标整数targetSum
我们的目的: 从二叉树中找出一条路径上节点值的和等于目标整数targetSum的路径,找到返回true,否则false;
解题方案: 主要有两种思路迭代法和递归,我们这里用精简的递归来实现,后面的逻辑你可以直接求每条路径的和与targetSum比较,也可以在遍历二叉树每条路径的时候对targetSum做减法,判断最终结果是否为0,我们用后者。

开始解题

var hasPathSum = function(root, targetSum) {
    // 首先判断节点是否存在
    if(!root) return false;  
    
    // 判断当前节点是不是叶子节点,如果是则说明这条路径到底了
    // 判断与targetSum做减法的剩余值与叶子节点的值是否相等,相等则说明符合题目所需
    if(!root.left && !root.right) return root.val === targetSum;  
    targetSum -= root.val;
    
    // 如果当前节点不是叶子节点,判断它的左右子节点是否是叶子节点以及节点值是否等于剩余值,一直递归查找下去
    return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum);
};