LeetCode 404.左叶子之和

404. 左叶子之和

Difficulty: 简单

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

示例:

    3
   / 
  9  20
    /  
   15   7

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

Solution

Language: ****

思路一:迭代

以下是错误解法:用层序遍历上瘾了。。。。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
​
class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        if not root:
            return 0
        queue, res, tmp = [root], 0, root.val
        while queue:
            size = len(queue)
            for i in range(size):
                node = queue.pop(0)
                if i == 0:
                    res += node.val
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        return res-tmp

以下是迭代思路的正确解法:

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        if not root:
            return 0
        queue, res = [root], 0
        while queue:
            size = len(queue)
            for i in range(size):
                node = queue.pop(0)
                if node.left:
                    queue.append(node.left)
                    if not node.left.left and not node.left.right:  # 只有当左节点没有孩子节点的时候才符合左叶子节点的要求
                        res += node.left.val
                if node.right:
                    queue.append(node.right)
        return res

思路二:递归

题意要求求所有的左叶子节点的和,那么对于一个节点,如果它的左节点没有孩子节点,说明它的左节点是叶子节点,此时需要把该左节点的值加到res中。然后我们可以在右节点上递归此步骤。

class Solution:
    def sumOfLeftLeaves(self, root: TreeNode) -> int:
        if not root:
            return 0
        res = 0
        if root.left:
            if not root.left.left and not root.left.right:
                res += root.left.val
            else:
                res += self.sumOfLeftLeaves(root.left)
                
        res += self.sumOfLeftLeaves(root.right)
        return res
原文地址:https://www.cnblogs.com/swordspoet/p/14094241.html