给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
提示:
- 节点数在
[1, 1000]
范围内 -1000 <= Node.val <= 1000
DFS,深度优先搜索。
从根节点开始,判断是否存在左节点,如果存在,判断左节点是否为叶子节点。如果是则加入结果,如果不是就以当前节点作为根节点继续计算。判断是否存在右节点,如果存在则以当前节点作为根节点计算。直至遍历整棵树。
/**
* 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) {
return dfs(root);
}
bool isLeaf(TreeNode* node){
return node->left == nullptr && node->right == nullptr;
}
int dfs(TreeNode* node){
int sum = 0;
if(node->left != nullptr){
if(isLeaf(node->left)){
sum += node->left->val;
}else{
sum += dfs(node->left);
}
}
if(node->right != nullptr){
sum += dfs(node->right);
}
return sum;
}
};
以下是代码的工作原理:
-
isLeaf
函数: 此函数检查给定的二叉树节点是否是叶子节点(即没有左子节点或右子节点)。 -
dfs
函数: 此函数使用深度优先搜索 (DFS) 遍历二叉树。它计算每个节点的子树中所有左叶子节点的和。- 如果一个节点有左子节点,则检查左子节点是否是叶子节点。如果是,则将左子节点的值添加到和中。如果不是,则对左子节点进行 DFS。
- 如果一个节点有右子节点,则对右子节点进行 DFS。
-
sumOfLeftLeaves
函数: 此函数调用dfs
函数从根节点开始遍历二叉树。它返回二叉树中所有左叶子节点的和。