![在这里插入图片描述](https://img-blog.csdnimg.cn/eaea4da66e0544e5a4f9d4288012aaaf.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATmVmdV9seWg=,size_20,color_FFFFFF,t_70,g_se,x_16)
https://leetcode-cn.com/problems/sum-of-left-leaves/submissions/
思路:
首先明确左叶子的概念:设当前的根节点是root,当前节点的左孩子不为空,且左孩子左右都为空时,root->left为左叶子。
求左叶子的问题可以变成求左子树的叶子+右子树的左叶子问题,因为要用左右子树的左叶子和求root的左叶子和,所以遍历顺序为左右中
或者右左中
。
确定函数参数及返回值:参数(根节点),返回值int,返回的是根节点左叶子的和
递归结束条件:root为NULL时return 0
不为NULL则寻找左右子树的左叶子和,处理当前根的左叶子,返回左右子树+根的左叶子和
递归代码:
/**
* 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 leftValue = sumOfLeftLeaves(root->left);
int rightValue = sumOfLeftLeaves(root->right);
//root->left是左叶子
int midValue=0;
if(root->left&&!root->left->left&&!root->left->right){
midValue=root->left->val;
}
int sum=leftValue+midValue+rightValue;
return sum;
}
};
精简递归代码
将左右子树的求取直接放到return后面,省略变量的设置。
/**
* 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 midValue=0;
if(root->left&&!root->left->left&&!root->left->right){
midValue=root->left->val;
}
int sum=midValue+sumOfLeftLeaves(root->left)+sumOfLeftLeaves(root->right);
return 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) {
stack<TreeNode*> s;
if(!root) return 0;
s.push(root);
int sum=0;
while(!s.empty()){
TreeNode *t = s.top();
s.pop();
if(t->left&&!t->left->left&&!t->left->right)
sum+=t->left->val;
if(t->right) s.push(t->right);
if(t->left) s.push(t->left);
}
return sum;
}
};