leetcode链接:https://leetcode-cn.com/problems/deepest-leaves-sum/

题目描述:

给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的和 。


思路1: 两次递归

最直接的思路是 1: 先得到树的最大深度;2: 将最大深度的节点值相加。这样需要两次递归。

  1. func deepestLeavesSum(root *TreeNode) int {
  2. //最大深度
  3. depth := deepestDepth(root)
  4. //最大深度叶子结点
  5. nums := []int{}
  6. findDeepest(root, &nums, depth)
  7. //相加求和
  8. var result int
  9. for _, n := range nums {
  10. result += n
  11. }
  12. return result
  13. }
  14. //获取最大深度的叶子结点
  15. func findDeepest(root *TreeNode, nums *[]int, depth int) {
  16. if root == nil {
  17. return
  18. }
  19. if depth == 1 {
  20. if root != nil {
  21. *nums = append(*nums, root.Val)
  22. }
  23. }
  24. findDeepest(root.Left, nums, depth - 1)
  25. findDeepest(root.Right, nums, depth - 1)
  26. }
  27. //获取最大深度
  28. func deepestDepth(root *TreeNode) int {
  29. if root == nil {
  30. return 0
  31. }
  32. if root.Left == nil && root.Right == nil {
  33. return 1
  34. }
  35. depthLeft := deepestDepth(root.Left)
  36. depthRight := deepestDepth(root.Right)
  37. if depthLeft > depthRight {
  38. return depthLeft + 1
  39. } else {
  40. return depthRight + 1
  41. }
  42. }

思路2: 层序遍历

通过层序遍历的方式获取每一层叶子结点,计算最后一层结点的和。这个思路会有额外的空间浪费。

  1. func deepestLeavesSum(root *TreeNode) int {
  2. //取出最后一层叶子结点加和
  3. result := levelTree(root)
  4. sum := 0
  5. if len(result) > 0 {
  6. for _, n := range result {
  7. sum += n
  8. }
  9. }
  10. return sum
  11. }
  12. //层序遍历,取出最后一层叶子结点
  13. func levelTree(root *TreeNode) []int {
  14. var result [][]int
  15. if root == nil {
  16. return nil
  17. }
  18. level := []*TreeNode{root}
  19. for len(level) > 0 {
  20. var levelLeaves []int
  21. levelTemp := []*TreeNode{}
  22. for i := 0; i < len(level); i ++ {
  23. levelLeaves = append(levelLeaves, level[i].Val)
  24. if level[i].Left != nil {
  25. levelTemp = append(levelTemp, level[i].Left)
  26. }
  27. if level[i].Right != nil {
  28. levelTemp = append(levelTemp, level[i].Right)
  29. }
  30. }
  31. level = levelTemp
  32. result = append(result, levelLeaves)
  33. }
  34. if len(result) > 0 {
  35. return result[len(result) - 1]
  36. }
  37. return []int{}
  38. }

思路3: 最优解 维护两个变量

递归求树的最大深度,同时维护两个全局变量 maxdep 和 sum,其中 maxdep表示搜索到的节点的最大深度,sum表示搜索到的深度等于 maxdep 的节点的权值之和。

  1. // sum为最终的和, maxdep为树的最大深度
  2. var sum, maxdep int
  3. func deepestLeavesSum(root *TreeNode) int {
  4. sum, maxdep = 0, 0
  5. deepestDepth(root, 0)
  6. return sum
  7. }
  8. func deepestDepth(root *TreeNode, depth int) {
  9. if root == nil {
  10. return
  11. }
  12. if depth > maxdep {
  13. maxdep = depth
  14. sum = root.Val
  15. } else if depth == maxdep {
  16. sum += root.Val
  17. }
  18. deepestDepth(root.Left, depth + 1)
  19. deepestDepth(root.Right, depth + 1)
  20. }