【二叉树算法题记录】404. 左叶子之和

题目描述

给定二叉树的根节点 root ,返回所有左叶子之和。

题目分析

其实这题无论是迭代法还是递归法,最重要的是要明确判断左叶子的条件 :当前节点有左孩子,且这个左孩子没有它的左孩子和右孩子。

迭代法

感觉只要二叉树相关的题递归想不出来,直接暴力上层序遍历就能解出来。迭代法真没什么难度,就是把内层while循环中处理当前节点的条件换成上面的逻辑就行,也即:

cpp 复制代码
if(node->left && node->left->left==NULL && node->left->right == NULL) 
	sum += node->left->val;

整体cpp代码:

cpp 复制代码
/**
 * 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:
    int sumOfLeftLeaves(TreeNode* root) {
        // 迭代法(层序遍历)
        queue<TreeNode*> q;
        int sum = 0;
        if(root!=NULL) q.push(root);

        while(!q.empty()){
            int size = q.size();
            while(size--){
                TreeNode* node = q.front();
                q.pop();

                if(node->left && node->left->left==NULL && node->left->right == NULL) 
                    sum += node->left->val;

                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
        }
        return sum;
    }
};

递归法

这里我和代码随想录中处理的不太一样,但是思路是一样的。我这里用了传出参数vector<int>& sum,所以我用什么遍历顺序都是对的。但是代码随想录中是用了int返回值,所以是要从下层传结果送至上层汇聚,那么这就必须要用后序遍历(左右中)。

我的cpp整体递归代码

注意:这里中左右的顺序可以任意变换,已经试过了,都能AC。

cpp 复制代码
/**
 * 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:
    void traversal(TreeNode* cur, vector<int>& sum){
        // 递归终止条件
        if(cur == NULL) return;
        
        if(cur->left) traversal(cur->left, sum);
        if(cur->right) traversal(cur->right, sum);
        
        // 单层递归逻辑:当该节点只有一个左孩子(左叶子)
        if(cur->left!=NULL && cur->left->left==NULL && cur->left->right==NULL){
            sum.push_back(cur->left->val);
        }
    }

    int sumOfLeftLeaves(TreeNode* root) {
        // 递归法
        vector<int> sum;
        traversal(root, sum);
        return accumulate(sum.begin(), sum.end(), 0);
    }
};

代码随想录的cpp整体递归代码

cpp 复制代码
class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if (root == NULL) return 0;
        if (root->left == NULL && root->right== NULL) return 0;

        int leftValue = sumOfLeftLeaves(root->left);    // 左
        if (root->left && !root->left->left && !root->left->right) { // 左子树就是一个左叶子的情况
            leftValue = root->left->val;
        }
        int rightValue = sumOfLeftLeaves(root->right);  // 右

        int sum = leftValue + rightValue;               // 中
        return sum;
    }
};
相关推荐
沐浴露z1 小时前
【JVM】详解 垃圾回收
java·jvm·算法
代码欢乐豆2 小时前
编译原理机测客观题(7)优化和代码生成练习题
数据结构·算法·编译原理
祁同伟.2 小时前
【C++】二叉搜索树(图码详解)
开发语言·数据结构·c++·容器·stl
Scc_hy3 小时前
强化学习_Paper_2000_Eligibility Traces for Off-Policy Policy Evaluation
人工智能·深度学习·算法·强化学习·rl
Joy T3 小时前
Solidity智能合约存储与数据结构精要
数据结构·区块链·密码学·智能合约·solidity·合约function
leke20033 小时前
2025年10月17日
算法
CoovallyAIHub3 小时前
Mamba-3震撼登场!Transformer最强挑战者再进化,已进入ICLR 2026盲审
深度学习·算法·计算机视觉
海绵宝宝的好伙伴4 小时前
【数据结构】哈希表的理论与实现
数据结构·哈希算法·散列表
Aqua Cheng.4 小时前
代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
java·数据结构·算法·散列表
zym大哥大4 小时前
哈希表封装myunordered_map以及set
数据结构·散列表