当前位置: 首页 > article >正文

【递归】7. leetcode 404 左叶子之和

1 题目描述

题目链接:左叶子之和
在这里插入图片描述

2 解答思路

递归分为三步,接下来就按照这三步来思考问题

第一步:挖掘出相同的子问题  (关系到具体函数头的设计)
第二步:只关心具体子问题做了什么  (关系到具体函数体怎么写,是一个宏观的过程)
第三步:找到递归的出口,防止死递归  (关系到如何跳出递归)

2.1 相同的子问题(函数头设计)

相同的子问题:寻找二叉树的左叶子,就是寻找二叉树的左子树的左叶子和右子树的左叶子。

根据相同的子问题,思考具体的方法:将所有的左叶子放入到一个vector中,最后使用循环将值相加到一起。

下面是leetcode给的接口:

    int sumOfLeftLeaves(TreeNode* root) {

    }

传入一个TreeNode* 类型的参数,返回是左叶子的和,int类型。

根据之前的分析,我们的参数是一个TreeNode*类型,还有一个vector< int>类型。因为值存储在vector中,最终计算,所以返回值类型为void。最终函数头的设计如下:

    void sum(TreeNode* root, vector<int>& res)
    {
    }

2.2 具体的子问题做了什么(函数体的实现)

具体子问题做了什么:

1.首先判断该节点的左孩子是不是叶子节点,如果是,则加入到vector中。
2.在当前节点的左子树中寻找
3.在当前节点的右子树中寻找

递归的出口:当前节点为空。

最终函数体的书写:

    void sum(TreeNode* root, vector<int>& res)
    {
        if (root == nullptr)
            return;
        
        //如果当前节点有左孩子 并且 左孩子为叶子节点
        if ((root->left) && ((root->left->left == nullptr) && (root->left->right == nullptr)))
            res.push_back(root->left->val);  //将左孩子的值加入到vector中
        
        //递归左子树
        sum(root->left, res);
        //递归右子树
        sum(root->right, res);
    }

3 总结

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        vector<int> res;
        sum(root, res);

        int s = 0;
        for (int i = 0; i < res.size(); ++ i)
        {
            s += res[i];
        }

        return s;
    }

    //只要叶子节点
    void sum(TreeNode* root, vector<int>& res)
    {
        if (root == nullptr)
            return;
        
        //如果当前节点有左孩子 并且 左孩子为叶子节点
        if ((root->left) && ((root->left->left == nullptr) && (root->left->right == nullptr)))
            res.push_back(root->left->val);  //将左孩子的值加入到vector中
        
        //递归左子树
        sum(root->left, res);
        //递归右子树
        sum(root->right, res);
    }
};
1. 相同的子问题:寻找二叉树的左叶子,就是寻找二叉树的左子树的左叶子和右子树的左叶子。
2. 具体子问题做了什么:首先判断该节点的左孩子是不是叶子节点,如果是,则加入到vector中。在当前节点的左子树中寻找。在当前节点的右子树中寻找。
3. 递归的出口:当前节点为空。

在这里插入图片描述


http://www.kler.cn/a/321424.html

相关文章:

  • 数据结构Python版
  • RabbitMQ 篇-深入了解延迟消息、MQ 可靠性(生产者可靠性、MQ 可靠性、消费者可靠性)
  • 创建型设计模式与面向接口编程
  • 现代无线通信接收机架构:超外差、零中频与低中频的比较分析
  • Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解
  • MySQL的SQL书写顺序和执行顺序
  • 宠物浮毛难清理,希喂、小米、美的宠物空气净化器该选哪款?
  • 深度学习:自然语言处理的基本原理
  • sqlserver迁移数据库文件存储位置
  • Java2 实用教程(第6版)习题2 第四题
  • Python | Leetcode Python题解之第438题找到字符串中所有字母异位词
  • 负载均衡SLB详解及其应用场景
  • 2024 Fortinet OT工业安全高峰论坛成功举办
  • 【yolov7】模型导出----pytorch导出为onnx模型
  • MacOS关闭,最小化窗口快捷键
  • Go基础学习06-Golang标准库container/list(双向链表)深入讲解;延迟初始化技术;Element;List;Ring
  • Java | Leetcode Java题解之第440题字典序的第K小数字
  • OIDC5-OIDC 的工作流程
  • 详解机器学习经典模型(原理及应用)——GBDT
  • springboot实战学习(7)(JWT令牌的组成、JWT令牌的使用与验证)
  • 计算机毕业设计之:微信小程序的校园闲置物品交易平台(源码+文档+讲解)
  • 【ARM 嵌入式 编译系列 10.5 -- ARM toolchain naming convention】
  • 如何在CMakeList项目中集成GNU Autotools 构建模块
  • JavaSE——Arrays类、System类
  • 网格大师OSGB转OBJ,转换类型中的非拓扑、拓扑、重建有什么区别?
  • 【Docker】01-Docker常见指令