404. 左叶子之和 - 力扣(LeetCode) (leetcode-cn.com)
左叶子之和
递归
- 当前树的左叶子之和 != 左右子树左叶子之和的和
- 当前树的左叶子之和 == 左右子树左叶子之和的和 + 当前点唯一判断的左叶子
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if (!root) return 0;
// 一个结点可以唯一判断一个左叶子
int leftLeave = 0;
// 如果是左叶子,那么就叠加
if (root->left && !root->left->left && !root->left->right) leftLeave += root->left->val;
return leftLeave + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
}
};
非递归
- 非递归后序遍历,(选择一个喜欢的遍历方式即可)
- 仅修改处理部分内容即可
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
int sum = 0;
stack<TreeNode*> stk;
if (!root) return sum;
stk.push(root);
while (!stk.empty()) {
TreeNode* node = stk.top();
stk.pop();
if (node) {
stk.push(node);
stk.push(nullptr);
if (node->right) stk.push(node->right);
if (node->left) stk.push(node->left);
}
else {
node = stk.top();
stk.pop();
// 如果有左叶子则叠加
if (node->left && !node->left->left && !node->left->right) {
sum += node->left->val;
}
}
}
return sum;
}
};