欢迎大家参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
# 404.左叶子之和 [力扣题目链接](https://leetcode-cn.com/problems/sum-of-left-leaves/) 计算给定二叉树的所有左叶子之和。 示例:  # 思路 **首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。** 因为题目中其实没有说清楚左叶子究竟是什么节点,那么我来给出左叶子的明确定义:**如果左节点不为空,且左节点没有左右孩子,那么这个节点就是左叶子** 大家思考一下如下图中二叉树,左叶子之和究竟是多少?  **其实是0,因为这棵树根本没有左叶子!** 那么**判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。** 如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下: ``` if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) { 左叶子节点处理逻辑 } ``` ## 递归法 递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。。 递归三部曲: 1. 确定递归函数的参数和返回值 判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int 使用题目中给出的函数就可以了。 2. 确定终止条件 依然是 ``` if (root == NULL) return 0; ``` 3. 确定单层递归的逻辑 当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。 代码如下: ```CPP int leftValue = sumOfLeftLeaves(root->left); // 左 int rightValue = sumOfLeftLeaves(root->right); // 右 // 中 int midValue = 0; if (root->left && !root->left->left && !root->left->right) { midValue = root->left->val; } int sum = midValue + leftValue + rightValue; return sum; ``` 整体递归代码如下: ```CPP class Solution { public: int sumOfLeftLeaves(TreeNode* root) { if (root == NULL) return 0; int leftValue = sumOfLeftLeaves(root->left); // 左 int rightValue = sumOfLeftLeaves(root->right); // 右 // 中 int midValue = 0; if (root->left && !root->left->left && !root->left->right) { // 中 midValue = root->left->val; } int sum = midValue + leftValue + rightValue; return sum; } }; ``` 以上代码精简之后如下: ```CPP class Solution { public: int sumOfLeftLeaves(TreeNode* root) { if (root == NULL) return 0; int midValue = 0; if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) { midValue = root->left->val; } return midValue + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right); } }; ``` ## 迭代法 本题迭代法使用前中后序都是可以的,只要把左叶子节点统计出来,就可以了,那么参考文章 [二叉树:听说递归能做的,栈也能做!](https://programmercarl.com/二叉树的迭代遍历.html)和[二叉树:迭代法统一写法](https://programmercarl.com/二叉树的统一迭代法.html)中的写法,可以写出一个前序遍历的迭代法。 判断条件都是一样的,代码如下: ```CPP class Solution { public: int sumOfLeftLeaves(TreeNode* root) { stack