整体思路:就是找到含有左叶子的父节点(注意,一个二叉树是不只有两个左叶子节点)
递归第一步:确定递归的参数和返回值
递归的参数就只有树节点,返回int类型的所有左叶子的数值
递归第二步:确定递归终止函数
如果当前节点是空节点,那么返回0;
如果当前节点的左子树跟右子树都为空的时候,返回0(没有左节点了);
if (root == NULL) return 0;
if (root->left == NULL && root->right== NULL) return 0;
递归第三步:明确单层循环的逻辑
当遇到有左叶子节点的时候,将值赋给leftValue中,在右子树中遇到含有的左节点赋值给rightValue,然后将leftValue跟rightValue的值相加返回。
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;
问题:为什么要先递归左节点后判断左叶子节点?
因为如果先判断左叶子节点后递归左节点的话,这样的话左叶子节点的值会被覆盖掉
问题:为什么终止条件不直接到左叶子节点,然后返回左叶子节点的值呢?
因为当你到左叶子节点的时候,你根本判断不了你就是左叶子节点。
最终代码:
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;
}
};