算法练习-树 LeetCode 112. 路径总和

今日心情:🥱🥱 麻了

题目描述:

LeetCode 112. 路径总和

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

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

 

 


解题代码:

/**
 * 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;
 *     }
 * }
 */
class Solution {

    public static void process(TreeNode x, int preSum, int sum){
        if(x.left == null && x.right == null){
            if(x.val + preSum == sum){
                isSum = true;
            }
            return;
        }
        //x 非叶子节点
        preSum += x.val;
        if(x.left != null){
            process(x.left,preSum, sum);
        }
        if(x.right != null){
            process(x.right, preSum, sum);
        }
    }

    public static boolean isSum = false;


    public boolean hasPathSum(TreeNode root, int targetSum) {

        if(root == null){return false;}
        isSum = false;
        process(root,0,targetSum);
        return isSum;
    }
}

解题思路:(来自左神 👉 数据结构与算法视频 

(1)采用递归思想

(2)首先判断树节点不为空的情况(为空不需要进行递归,直接返回false)

(3)设置一个存在path满足sum == targetsum条件的标志 isSum = false(判断当前path是否满足条件)

(4)递归方法 process 参数: 当前treenode 节点 x , 之前所有节点的值的总和presum,需要达到的目标sum。

        1. 首先判断叶子节点处的情况(结束当前递归调用)

            x.left == null && x.right == null (叶子节点左右均无节点)

           如果该节点是叶子节点,那么presum + x.val (之前所有节点值总和 + 当前节点值 )是否满足targetsum 的要求,如果是则说明存在这样的节点 path 满足这样的sum要求,此时 isSum 设置为 true,否则isSum仍然为false。然后返回 空 return ;(只需要在满足条件下,改变isSum的状态值即可)。

        2. 对于非叶子节点的处理

            计算presum += x.val (计算presum 直到加到叶子节点为止)

            如果当前节点存在左右节点,则进行递归调用,直到叶子节点的判断为止,最终返回。

             x.left != null ; x.right != null

 (5)在主函数中调用process方法,然后返回isSum的值,如果存在满足sum条件的path,那么isSum的值将从false改变为true。


小结:

        感觉递归调用在tree里面用的超级多,难点在于如何根据题目要求,提取出递归调用的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值