# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def sumOfLeftLeaves(self, root, left = False):
"""
:type root: TreeNode
:rtype: int
"""
if not root: return 0
if not root.left and not root.right: return root.val if left else 0
return self.sumOfLeftLeaves(root.left, True) + self.sumOfLeftLeaves(root.right, False)
JavaScript Code
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var sumOfLeftLeaves = function (root, isLeft = false) {
if (!root) return 0;
if (!root.left && !root.right && isLeft) return root.val;
return (
sumOfLeftLeaves(root.left, true) + sumOfLeftLeaves(root.right, false)
);
};
方法 2:迭代+栈
思路
其实只要知道怎么判断左叶子节点,剩下的就是遍历二叉树的模板了,爱怎么遍历都行。
复杂度
时间复杂度:$O(N)$,N 为节点数。
空间复杂度:$O(h)$,h 为树的高度。
代码
JavaScript Code
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var sumOfLeftLeaves = function (root) {
if (!root) return 0;
let sum = 0;
const stack = [root];
while (stack.length) {
const node = stack.pop();
if (!node.left && !node.right && node.isLeft) sum += node.val;
delete node.isLeft;
if (node.left) {
node.left.isLeft = true;
stack.push(node.left);
}
node.right && stack.push(node.right);
}
return sum;
};