0404左子叶之和 Marathon

计算给定二叉树的所有左叶子之和。

示例:

在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-left-leaves

参考:

python

# 404.左子叶之和
class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        """
        前序递归
        :param root:
        :return:
        """
        if not root:
            return 0

        # 左子树左叶子和
        leftLeftLeavesSum = self.sumOfLeftLeaves(root.left)
        # 右子树左叶子和
        rightLeftLeavesSum = self.sumOfLeftLeaves(root.right)

        curLeftLeafVal = 0
        if root.left and not root.left.left and not root.left.right:
            curLeftLeafVal = root.left.val # 中

        return curLeftLeafVal + leftLeftLeavesSum + rightLeftLeavesSum

class Solution2:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        stack = []
        if root:
            stack.append(root)
        sum = 0

        while stack:
            # 每次放入当前节点的左节点
            curNode = stack.pop()
            if curNode.left and not curNode.left.left and not curNode.left.right:
                sum += curNode.left.val

            if curNode.left:
                stack.append(curNode.left)
            if curNode.right:
                stack.append(curNode.right)

        return sum


golang

package binaryTree

import "container/list"

// 递归法
func sumOfLeftLeaves1(root *TreeNode) int {
	var res int
	findLeft(root, &res)
	return res
}

func findLeft(root *TreeNode, res *int)  {
	if root.Left != nil && root.Left.Left == nil && root.Left.Right == nil {
		*res = *res + root.Left.Val
	}
	if root.Left != nil {
		findLeft(root.Left, res)
	}
	if root.Right != nil {
		findLeft(root.Right, res)
	}
}

// 迭代法
func sumOfLeftLeaves2(root *TreeNode) int {
	var res int
	queue := list.New()
	queue.PushBack(root)
	for queue.Len() > 0 {
		length := queue.Len()
		for i:=0;i<length;i++ {
			node := queue.Remove(queue.Front()).(*TreeNode)
			if node.Left != nil && node.Left.Left == nil && node.Left.Right == nil {
				res = res + node.Left.Val
			}
			if node.Left != nil {
				queue.PushBack(node.Left)
			}
			if node.Right != nil {
				queue.PushBack(node.Right)
			}
		}
	}
	return res
}
原文地址:https://www.cnblogs.com/davis12/p/15554371.html