leetcode 404. 左叶子之和

196 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

题目描述

给定二叉树的根节点 root ,返回所有左叶子之和。

解题思路

这道题的最核心的点就是找到二叉树的所有左叶子节点,找到所有左叶子节点后求和就十分简单了。叶子节点就是没有左右子节点的节点,而左叶子节点就需要限制节点本身就是左节点。根据这些限制条件,可以推断出当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。

左叶子节点需要满足:其父节点左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空。

也就是:

node.left && node.left.left === null && node.left.right === null

通过判断上面的条件,可以找到符合条件的节点进行处理。

接下来我们需要确定递归的逻辑:

  1. 首先需要确定递归的返回值,本题递归的返回值就是已经遍历到的左叶子节点的和
  2. 接下来确定递归的终止条件。可以很容易得出:如果节点为空返回0即可。
  3. 最后需要确定单层递归的逻辑,递归一次需要处理——当遇到左叶子节点的时候,记录下左叶子节点的数值。通过递归求左子树左叶子节点的值的和、右子树左叶子节点的值的和,相加求出整个二叉树左叶子节点的和。

经过上面的分析我们就能很容易的写出框架,将细节补充完整代码如下:

完整代码

var sumOfLeftLeaves = function(root) {
    const nodeSum = function(node) {
        if(node === null) {
            return 0
        }
        let leftValue = nodeSum(node.left)
        let rightValue = nodeSum(node.right)
        let midValue = 0
        if(node.left && node.left.left === null && node.left.right === null) {
            midValue = node.left.val
        }
        let sum = midValue + leftValue + rightValue
        return sum
    }
    return nodeSum(root)
};

后记

二叉树的递归法有很强的逻辑性,在做题的时候十分容易绕进去,所以要多做题多总结,加油!