给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1]
输出: 0
解题思路:这道题我的解法是先把所有的左节点都存起来,然后再对这些节点进行遍历,如果有节点存在左子节点和右子节点都为空的情况,说明是左叶子节点,把这些节点值相加。把所有左节点都存起来用到了递归。
- 确定递归函数参数和返回值:参数需要传入根节点以及存储所有左节点的动态数组,返回值为void。
- 确定终止条件:当前节点为空时,return。
- 确定单层递归逻辑:如果当前节点的左子树存在,把左子树加入到动态数组里。然后把左子树的所有左节点存起来,右子树中的所有左节点存起来。
这种方法用到了额外的空间,如果想看比较简洁的算法,可以参考代码随想录。
代码:
class Solution { //404. 左叶子之和
public:
int sumOfLeftLeaves(TreeNode* root) {
if (root == nullptr) return 0;
int sum = 0;
vector<TreeNode*> leftNodes;
_storeAllLeftNodes(root, leftNodes);
for (int i = 0; i < leftNodes.size(); ++i) {
if (leftNodes[i]->left == nullptr && leftNodes[i]->right == nullptr) {
sum += leftNodes[i]->val;
}
}
return sum;
}
private:
void _storeAllLeftNodes(TreeNode* cur, vector<TreeNode*>& leftNodes) {
if (cur == nullptr) return;
if (cur->left) {
leftNodes.push_back(cur->left);
}
_storeAllLeftNodes(cur->left, leftNodes);
_storeAllLeftNodes(cur->right, leftNodes);
}
};