左叶子之和——DFS , BFS

71 阅读1分钟

image.png

DFS:

  1. 加入答案的前提是,当前节点属于左节点且是叶子节点,所以我们要从它的父节点处判断,当前节点是否是左节点
  2. 首先当前节点的左节点不为nil,然后判断其左节点是否是叶子节点,是则加入答案,不是则进入递归下一层
  3. 如果右节点不为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
}