DFS:
- 加入答案的前提是,当前节点属于左节点且是叶子节点,所以我们要从它的父节点处判断,当前节点是否是左节点
- 首先当前节点的左节点不为nil,然后判断其左节点是否是叶子节点,是则加入答案,不是则进入递归下一层
- 如果右节点不为nil,且不是叶子节点,则进入下一层,这里相当于提前剪枝了
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isLeafNode(node *TreeNode) bool {
return node.Left == nil && node.Right == nil
}
func dfs(node *TreeNode) (ans int) {
if node.Left != nil {
if isLeafNode(node.Left) {
ans += node.Left.Val
} else {
ans += dfs(node.Left)
}
}
if node.Right != nil && !isLeafNode(node.Right) {
ans += dfs(node.Right)
}
return
}
func sumOfLeftLeaves(root *TreeNode) int {
if root == nil {
return 0
}
return dfs(root)
}
BFS:
BFS效果一样,由递归变成了层序遍历,判断条件与dfs相同,都需要从当前节点看子节点,也就是遍历到倒数第二层就好了
func isLeafNode(node *TreeNode) bool {
return node.Left == nil && node.Right == nil
}
func sumOfLeftLeaves(root *TreeNode) (ans int) {
if root == nil {
return
}
q := []*TreeNode{root}
for len(q) > 0 {
node := q[0]
q = q[1:]
if node.Left != nil {
if isLeafNode(node.Left) {
ans += node.Left.Val
} else {
q = append(q, node.Left)
}
}
if node.Right != nil && !isLeafNode(node.Right) {
q = append(q, node.Right)
}
}
return
}