110. 平衡二叉树
简单
 给定一个二叉树,判断它是否是高度平衡的二叉树。
 本题中,一棵高度平衡二叉树定义为:
 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
 [图片]
 输入:root = [3,9,20,null,null,15,7]
 输出:true
 示例 2:
 [图片]
 输入:root = [1,2,2,3,3,null,null,4,4]
 输出:false
 示例 3:
 输入:root = []
 输出:true
提示:
- 树中的节点数在范围 [0, 5000] 内
 - -10(4) <= Node.val <= 10(4)
 
思考
- 递归数值传递问题
 
代码
func isBalanced(root *TreeNode) bool {
    if root == nil {
        return true
    }
    _, flag := dfs_isBalanced(root)
    return flag
}
func dfs_isBalanced(root *TreeNode) (int, bool) {
    if root == nil {
        return 0, true
    }
    // 获取左右子树的高度和平衡信息
    l, l_flag := dfs_isBalanced(root.Left)
    r, r_flag := dfs_isBalanced(root.Right)
    // 检查当前子树是否平衡
    if !l_flag || !r_flag || abs(l-r) > 1 {
        return max(l, r) + 1, false
    }
    // 返回当前子树的高度
    return max(l, r) + 1, true
}
func abs(x int) int {
    if x < 0 {
        return -x
    }
    return x
}
func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}
 
257. 二叉树的所有路径
简单
 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
 叶子节点 是指没有子节点的节点。
示例 1:
 [图片]
 输入:root = [1,2,3,null,5]
 输出:[“1->2->5”,“1->3”]
 示例 2:
 输入:root = [1]
 输出:[“1”]
提示:
- 树中节点的数目在范围 [1, 100] 内
 - -100 <= Node.val <= 100
 
代码
func binaryTreePaths(root *TreeNode) []string {
   res := make([]string, 0)
   temp := make([]int, 0)
   binaryTreePaths_dfs(root, temp, &res)
   return res
}
func binaryTreePaths_dfs(root *TreeNode, s []int, res *[]string) {
   if root == nil {
      return
   }
   s = append(s, root.Val)
   if root.Left == nil && root.Right == nil {
      // 只有在叶子节点时将路径添加到结果
      path := strings.Trim(strings.Join(strings.Fields(fmt.Sprint(s)), "->"), " ")
      path = strings.Trim(path, "[")
      path = strings.Trim(path, "]")
      *res = append(*res, path)
   }
   binaryTreePaths_dfs(root.Left, s, res)
   binaryTreePaths_dfs(root.Right, s, res)
}
var res []string    //不安全,学习上面的方法
func binaryTreePaths(root *TreeNode) []string {
    res=make([]string,0)
    tmp := ""
    dfs_BTP(root, tmp)
    return res
}
func dfs_BTP(root *TreeNode, tmp string) {
    if root == nil {
        return
    }
    if len(tmp)==0{
        tmp = tmp + strconv.Itoa(root.Val)
    }else{
        tmp = tmp + "->" + strconv.Itoa(root.Val)
    }
    
    if root.Left == nil && root.Right == nil {
        res = append(res, tmp)
    }
    dfs_BTP(root.Left, tmp)
    dfs_BTP(root.Right, tmp)
    return
}
 
404. 左叶子之和
简单
 给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:
 [图片]
 输入: root = [3,9,20,null,null,15,7]
 输出: 24
 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
 示例 2:
 输入: root = [1]
 输出: 0
提示:
- 节点数在 [1, 1000] 范围内
 - -1000 <= Node.val <= 1000
 
代码
func sumOfLeftLeaves(root *TreeNode) int {
   if root == nil {
      return 0
   }
   //左子树
   left := sumOfLeftLeaves(root.Left) 
   //没有左子树,就是左叶子节点
   if root.Left != nil && root.Left.Left == nil && root.Left.Right == nil {
      left = root.Left.Val
   }
   
   //右子树的左叶子节点
   right := sumOfLeftLeaves(root.Right)
   return left + right
}










