代码随想录算法训练营第17天|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值