Day15|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

好像不知不觉就到了回溯的部分了,也就是从上往下遍历的时候,退后上一级时需要注意参数的变化,注意参数也要退回到上一层才可以。

110.平衡二叉树

平衡二叉树
虽然说是判断深度,但是代码随想录还是从高度出发,因此依旧是后序遍历。
而且后续遍历自我感觉就是适用于从下网上进行比较的,特别适合这种需要进行对比的。

func isBalanced(root *TreeNode) bool {
    if GetHeight(root) == -1 { return false}
    return true

}
func GetHeight(root *TreeNode) int{
    if root == nil {return 0}
    lefthegiht := GetHeight((*root).Left)
    if lefthegiht == -1 {return -1}
    rightheight := GetHeight((*root).Right)
    if rightheight == -1{return -1}

    num := lefthegiht - rightheight
    if int(math.Abs(float64(num))) > 1 {return -1}

    return int(math.Max(float64(lefthegiht),float64(rightheight))) + 1
}

257. 二叉树的所有路径

二叉树的所有路径
路径就是从上往下寻找,到了最后叶子节点的地方就停下,记录一整条路径。
因为是从上往下遍历,所以采用前序遍历的方式(感觉从下往上就是后序)。难顶的是写的时候不知道可以直接用go的方式将int转为string,然后用 + 进行拼接

strconv.Itoa(node.Val)+"->"   //先将int转为string,然后用+进行拼接
func binaryTreePaths(root *TreeNode) []string {
    ret := make([]string, 0)
    single := make([]byte,0)
    //single = append(single, byte((*root).Val + '0'))
    dfs(root, single, &ret)
    return ret
}
func dfs(root *TreeNode, single []byte, ret *[]string){
    single = append(single, '-')
    single = append(single, '>')
    tmp := (*root).Val
    if (*root).Val < 0 {
        single = append(single, '-')
        tmp *= -1
    }
    ins := make([]byte, 0)
    for tmp > 0{        
            ins = append(ins, byte(tmp %10 + '0'))
            tmp /= 10
    }
    for i := len(ins) - 1; i >= 0 ;i--{
        single = append(single, ins[i])
    }
        
    if (*root).Left == nil && (*root).Right == nil{
        *ret = append(*ret, string(single[2:]))
    }

    if (*root).Left != nil{
        dfs((*root).Left, single, ret)
    }
    if (*root).Right != nil{
        dfs((*root).Right, single, ret)
    }
}

404.左叶子之和

左叶子之和
这道题是求所有左叶子节点的值,所以需要判断是否是叶子节点,然后返回其左值。
比较绕的一道题,需要好好看看才可以。

func sumOfLeftLeaves(root *TreeNode) int {
    if root == nil {return 0}
    
    if (*root).Left == nil && (*root).Right == nil{return 0}
    

    leftsum := sumOfLeftLeaves((*root).Left)
    if (*root).Left != nil && (*((*root).Left)).Left == nil && (*((*root).Left)).Right == nil{
        leftsum = (*((*root).Left)).Val
    }



    Rightsum := sumOfLeftLeaves((*root).Right)

    return leftsum + Rightsum
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值