返回

LeetCode 0404.左叶子之和

左叶子之和

LeetCode404. 左叶子之和

题目描述

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

思考

左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

无法对当前节点直接判断是不是左叶子节点,必须要通过父节点来判断其左孩子是不是左叶子

递归的遍历顺序为后序遍历(左右中),因为要通过递归函数的返回值来累加求取左叶子数值之和

  1. 确定递归函数的参数和返回值
    • 参数:传入根节点
    • 返回值:节点值
  2. 确定终止条件
    • 遍历到空节点,那么其左叶子值一定是0,返回0
  3. 确定单层递归的逻辑
    • 当遇到左叶子节点的时候,记录数值
    • 通过递归求取根节点的 左子树左叶子之和 和 右子树左叶子之和,相加便是整个树的左叶子之和

代码

Go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
func sumOfLeftLeaves(root *TreeNode) int {
    var res int //定义变量res 结果集
    findLeft(root, &res)
    return res
}

//递归DFS搜索到所有左叶子节点,和值计入res
func findLeft(root *TreeNode, res *int) {
    //以传入节点为根节点的 左孩子非空 且 该左孩子的左右孩子为空(是叶子节点)
    if root.Left != nil && root.Left.Left == nil && root.Left.Right == nil {
        //将该左孩子的节点值加入结果集res
        *res = *res + root.Left.Val
    }
    //以传入节点为根节点的 左孩子非空 但 该左孩子的左右孩子至少一个非空(不是叶子节点)
    if root.Left != nil {
        findLeft(root.Left, res) //递归
    }
    //以传入节点为根节点的 右孩子非空 但 该右孩子的左右孩子至少一个非空(不是叶子节点)
    if root.Right != nil {
        findLeft(root.Right, res) //递归
    }
}

GitHub

Built with Hugo
Theme Stack designed by Jimmy