题目
给定二叉树的根节点 root ,返回所有左叶子之和。
示例
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
解析
首先需要判断什么是左叶子:即一个节点,左子节点有值,左子节点的左子节点为nil,左子节点的右子节点为nil,则该左节点符合条件。
递归法:后序遍历,左右根;因为要通过递归函数的返回值来累加求取左叶子数值之和
建议直接用迭代法吧
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func sumOfLeftLeaves(root *TreeNode) int {
var res int
findLeft(root, &res)
return res
}
func findLeft(node *TreeNode, res *int) {
if node.Left != nil && node.Left.Left == nil && node.Left.Right == nil {
*res = *res + node.Left.Val
}
if node.Left != nil {
findLeft(node.Left, res)
}
if node.Right != nil {
findLeft(node.Right, res)
}
}
迭代法,和之前的很相似,没什么特别的:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func sumOfLeftLeaves(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 += node.Left.Val
}
if node.Left != nil {
queue.PushBack(node.Left)
}
if node.Right != nil {
queue.PushBack(node.Right)
}
}
}
return res
}