代码解决
/** * 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) { queue<TreeNode*> que; // 定义一个队列用于广度优先搜索 if (root != nullptr) que.push(root); // 如果根节点不为空,将其加入队列 int sum = 0; // 用于累加左叶子节点的和 // 当队列不为空时进行循环 while (!que.empty()) { int size = que.size(); // 获取当前队列的大小 TreeNode* node; // 用于存储当前节点 // 遍历当前层的所有节点 for (int i = 0; i < size; i++) { node = que.front(); // 取出队列的头节点 que.pop(); // 弹出头节点 // 如果左子节点存在 if (node->left) { que.push(node->left); // 将左子节点加入队列 // 如果左子节点是叶子节点,累加其值到sum if (node->left->left == nullptr && node->left->right == nullptr) { sum += node->left->val; } } // 如果右子节点存在,将其加入队列 if (node->right) que.push(node->right); } } return sum; // 返回左叶子节点的和 } };
TreeNode 结构体定义:
val
:节点的整数值。left
:指向左子节点的指针。right
:指向右子节点的指针。Solution 类:
- 包含一个公有方法
sumOfLeftLeaves
。sumOfLeftLeaves 方法:
- 使用广度优先搜索(BFS)来遍历二叉树。
- 定义一个队列
que
来存储节点,用于层次遍历。- 如果根节点不为空,将其加入队列。
- 初始化
sum
为 0,用于累加左叶子节点的值。- 当队列不为空时,进行循环:
- 获取当前层的节点数量
size
。- 遍历当前层的所有节点:
- 取出队列的头节点
node
并弹出。- 如果左子节点存在:
- 将左子节点加入队列。
- 如果左子节点是叶子节点,将其值累加到
sum
。- 如果右子节点存在,将其加入队列。
- 返回
sum
,即所有左叶子节点的和。
方法二
/** * 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) { // 如果根节点为空,返回0 if (root == nullptr) return 0; // 如果根节点是叶子节点(不算作左叶子),返回0 if (root->left == nullptr && root->right == nullptr) return 0; // 递归计算左子树中左叶子节点的和 int leftval = sumOfLeftLeaves(root->left); // 如果左子节点存在且是叶子节点,直接取其值 if (root->left && root->left->left == nullptr && root->left->right == nullptr) { leftval = root->left->val; } // 递归计算右子树中左叶子节点的和 int rightval = sumOfLeftLeaves(root->right); // 返回左子树和右子树中左叶子节点的和 int sum = leftval + rightval; return sum; } };
sumOfLeftLeaves 方法:
- 递归计算二叉树中所有左叶子节点的和。
- 如果根节点为空,返回 0。
- 如果根节点是叶子节点,返回 0(因为根节点不算作左叶子)。
- 递归计算左子树中左叶子节点的和
leftval
。- 如果左子节点存在且是叶子节点,直接取其值。
- 递归计算右子树中左叶子节点的和
rightval
。- 返回左子树和右子树中左叶子节点的和。