这么久过去了,递归仍然是压4我的一座大山啊啊啊啊啊~~~~~
#include <iostream>
#include <vector>
#include <string>
using namespace std;
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 == NULL) return 0;
if(root->left == NULL && root->right == NULL) return 0;
int left = sumOfLeftLeaves(root->left);
if(root->left != NULL && root->left->left == NULL && root->left->right == NULL)
{
left = root->left->val;
}
int right = sumOfLeftLeaves(root->right);
int sum = left + right;
return sum;
}
};
int main() {
TreeNode* root = new TreeNode(3);
root->left = new TreeNode(9);
root->right = new TreeNode(20);
root->right->left = new TreeNode(15);
root->right->right = new TreeNode(7);
Solution solution;
int result = solution.sumOfLeftLeaves(root);
cout << result << endl;
return 0;
}
评论区看到一条前序遍历的解法,更容易理解:
class Solution {
int res=0;//全局变量存放累加的左叶子节点之和
public int sumOfLeftLeaves(TreeNode root) {
if(root==null)return 0;//终止条件
//满足下列条件,该节点的左子节点即是左叶子节点
if(root.left!=null&&root.left.left==null&&root.left.right==null){
res+=root.left.val;//判断左叶子节点只能从当前节点判断,如果是左叶子节点,加入结果集
}
sumOfLeftLeaves(root.left);//遍历左树
sumOfLeftLeaves(root.right);//遍历右树
return res;//遍历完所有节点,返回左叶子之和
}
};