题目
给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1]
输出: 0
提示:
- 节点数在
[1, 1000]
范围内 -
解题方法
递归 DFS
通过父节点从而判断左叶子(左节点不为空且无左右孩子)
时间复杂度O(n)
,空间复杂度O(n)
C++代码:/** * 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) { if(!root) return 0; int val = 0; if(root->left && !root->left->left && !root->left->right) val = root->left->val; return val + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right); } };
迭代 BFS
通过迭代 BFS 遍历二叉树节点,记录左叶子值之和。
时间复杂度O(n)
,空间复杂度O(n)
C++代码:/** * 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*> nodes; int val = 0; if(!root) return val; nodes.push(root); while(nodes.size()>0) { TreeNode *cur = nodes.front(); nodes.pop(); if(cur->left) { if(!cur->left->left && !cur->left->right) val += cur->left->val; else nodes.push(cur->left); } if(cur->right) nodes.push(cur->right); } return val; } };