题目描述
给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1]
输出: 0
提示:
- 节点数在 [1, 1000] 范围内
- -1000 <= Node.val <= 1000
解题思路
左叶子:节点 A 的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么 A 节点的左孩子为左叶子节点。
那么判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下:
if (node->left != NULL && node->left->left != NULL && node->left->right != NULL) {
左叶子节点处理逻辑
}
因为要通过递归函数的返回值来累加求取左叶子数值之和,所以使用后序遍历(左右中)。
递归法
递归三部曲
- 确定递归函数的参数和返回值
传入的参数为根节点,递归函数的返回值为节点的数值之和,所以返回值为int
,使用题目给的函数即可。int sumOfLeftLeaves(TreeNode* root){}
- 确定递归的终止条件
遍历到空节点那么左叶子值一定为0。同时因为要从父节点开始判断,所以如果遍历到了叶子节点,那么它的左叶子也为0if (root +== NULL) return 0; if (root->left == NULL && root->right == NULL) return 0;
- 确定单层递归的逻辑
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和右子树左叶子之和,相加便是整个树的左叶子之和。int leftValue = sumOfLeftLeaves(root->left); if (node->left != NULL && node->left->left != NULL && node->left->right != NULL) { 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->cal;
}
int rightValue = sumOfLeftLeaves(root->right);
int sum = leftValue + rightValue;
retrun sum;
}
};
迭代法
// 后序遍历:左右中
// 入栈顺序:中右左
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
queue<TreeNode*> st;
if (root == NULL) return 0;
st.push(root);
int result = 0;
while (!que.empty()) {
TreeNode* node = st.top();
st.pop();
if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
result += node->left->val;
}
if (node->right) st.push(node->right);
if (node->left) st.push(node->left);
}
return result;
}
};