给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:

输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
- //bfs
- class Solution {
- public:
- int sumOfLeftLeaves(TreeNode* root) {
- //bfs,记录每一层第一个元素且时叶子节点
- stack
st; - int sum = 0;
- if(!root) return 0;
- st.push(root);
- while(!st.empty()){
- TreeNode* node= st.top();
- st.pop();
- if(node->left && !node->left->left && !node->left->right){
- sum += node->left->val;
- }
- if(node->right) st.push(node->right);
- if(node->left) st.push(node->left);
- }
- return sum;
- }
- };
-
- //bfs,队列,不要用找左叶子最左叶子的方法,那道题是相对来说最左。所以判左逻辑不全面
- class Solution {
- public:
- int sumOfLeftLeaves(TreeNode* root) {
- //bfs,记录每一层第一个元素且时叶子节点
- queue
que; - int sum = 0;
- if(!root) return 0;
- que.push(root);
- while(!que.empty()){
- int size = que.size();
- for(int i = 0;i < size;i++){
- TreeNode* node = que.front();
- que.pop();
- //判断左叶子逻辑有问题。1
- // \
- // 2 这种情况
- //if(i == 0 && !node->left && !node->right){
- // sum += node->val;
- //}
- if(node->left && !node->left->left && !node->left->right){
- sum += node->left->val;
- }
- if(node->left) que.push(node->left);
- if(node->right) que.push(node->right);
- }
- }
- return sum;
- }
- };
- //dfs,有点不明白如何选择递归方式,以及返回值
- class Solution {
- public:
- int dfs(TreeNode* root){
- if(!root) return 0;
- int leftsum = dfs(root->left);
- if(root->left && !root->left->left && !root->left->right){
- leftsum = root->left->val;
- }
- int rightsum = dfs(root->right);
- return leftsum+rightsum;
- }
- int sumOfLeftLeaves(TreeNode* root) {
- //dfs
- return dfs(root);
- }
- };