每日一题&&学习笔记

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 的根节点到叶子节点的路径。

示例 3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

这道题可以使用递归的方法做,因为当树为空,目标值为0时,会返回false,所以先判断树的根节点是否为空。然后访问节点的左右结点是否为空,若都为空,则判断目标值是否等于当前路径之和,然后递归继续访问下一个结点的左右结点,目标值变为targetSum-root->val,val为当前路径之和。其实是深度优先搜索的思想。

leetcode代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root==nullptr){
            return false;
        }
        if(root->left==nullptr&&root->right==nullptr){
            return targetSum==root->val;
        }
        return hasPathSum(root->left,targetSum-root->val)||hasPathSum(root->right,targetSum-root->val);
    }
};

还可以使用广度优先搜索的方式,记录从根节点到当前节点的路径和,以防止重复计算。使用两个队列,分别存储将要遍历的节点,以及根节点到这些节点的路径和即可。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root==nullptr){
            return false;
        }
        //定义两个队列,分别存将要遍历的结点和根节点到这些结点的路径之和
        queue<TreeNode *> que_node;
        queue<int> val_node;
        //分别将根节点和根节点到下一节点的路径入队
        que_node.push(root);
        val_node.push(root->val);
        while(!que_node.empty()){
            //定义节点队列中的当前节点
            TreeNode *now=que_node.front();
            //定义路径队列的中间变量
            int temp=val_node.front();
            //转换完成后各自出队
            que_node.pop();
            val_node.pop();
            //判断当前节点的左右子节点是否为空,若为空,则返回当前路径总和是否等于目标值
            if(now->left==nullptr&&now->right==nullptr){
                if(targetSum==temp)
                    return true;
            }
            //判断左子节点是否为空,若为不为空,则入队,并将当前路径之和入队
            if(now->left!=nullptr){
                que_node.push(now->left);
                val_node.push(temp+now->left->val);
            }
            //同样判断右子节点是否为空
            if(now->right!=nullptr){
                que_node.push(now->right);
                val_node.push(temp+now->right->val);
            }
        }
        return false;
    }
};

有大佬能解释下为什么将if(targetSum==temp)return true;直接替换成return targetSum==temp会无法通过吗!!!!!!跪谢!!!!

大三学生如果准备考研,制定一个合理的学习计划至关重要。下面是一个建议的大三计算机专业考研学习计划,你可以根据自己的实际情况进行调整: **每天的学习时间分配(假设总时间7-8小时):** 1. **早晨(6:30-8:00):** 早起阅读英语(词汇和阅读理解),或背诵专业课知识点。 2. **上午(8:30-12:00):** 主攻数学或专业基础课程,如数据结构、算法、操作系统等。每门课程分段学习,注重理解和做题。 3. **午休(12:00-13:30):** 合理休息,吃午饭和短暂午睡,为下午保持精力。 4. **下午(13:30-17:00):** 进行专业课复习,如计算机网络、数据库原理等。同时做一些习题巩固。 5. **晚上(17:30-20:00):** 分析历年考研真题,或进行模拟考试。同时注意政治、英语等公共科目的复习。 6. **晚上(20:00-21:30):** 总结一天的学习,整理笔记,回顾重点难点。 7. **晚间(21:30-22:00):** 放松娱乐,比如阅读、运动或听音乐,帮助缓解压力。 **每周的计划(周末留出更多时间进行整体复习和模拟考试):** - 周末:系统复习本周所学内容,做一套完整的模拟试题,并分析错题。 **注意事项:** 1. **保持健康生活**:保证充足的睡眠,均衡饮食,适度运动。 2. **定期测试**:定期进行自我测试,了解进度和薄弱环节。 3. **调整节奏**:根据学习效率灵活调整计划,遇到难题时适当延长学习时间。 4. **保持兴趣**:对考研的热情和兴趣是持久学习的关键。 5. **心理调适**:保持积极心态,学会应对压力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值