从零开始的力扣刷题记录-第十六天

力扣每日四题

  • 101.对称二叉树-简单
  • 244.二叉树的前序遍历-简单
  • 404.左叶子之和-简单
  • 566.重塑矩阵-简单
  • 总结

101.对称二叉树-简单

题目描述:
给你一个二叉树的根节点 root , 检查它是否轴对称。

题解:
简单的递归,唯一要注意的就是不能直接递归,因为传入参数只有一个root,需要新建一个函数,传入两个参数,这样才能对比二叉树是否对称

代码(Go):

func isSymmetric(root *TreeNode) bool {
    if root == nil{
        return true
    }
    return isSame(root.Left,root.Right)
}

func isSame(rootl *TreeNode,rootr *TreeNode) bool{
    if rootl == nil && rootr == nil{
        return true
    }else if rootl == nil || rootr ==  nil{
        return false
    }
    if rootl.Val == rootr.Val{
        return isSame(rootl.Right,rootr.Left) && isSame(rootl.Left, rootr.Right)
    }
    return false
}

244.二叉树的前序遍历-简单

题目描述:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

题解:
递归很简单,迭代使用栈实现,官方题解有之前提到过的Morris算法,目前还是学的不太明白

代码(Go):

func preorderTraversal(root *TreeNode) (vals []int) {
    stack := []*TreeNode{}
    node := root
    for node != nil || len(stack) > 0 {
        for node != nil {
            vals = append(vals, node.Val)
            stack = append(stack, node)
            node = node.Left
        }
        node = stack[len(stack)-1].Right
        stack = stack[:len(stack)-1]
    }
    return
}

404.左叶子之和-简单

题目描述:
给定二叉树的根节点 root ,返回所有左叶子之和。

题解:
递归解决

代码(Go):

func sumOfLeftLeaves(root *TreeNode) int {
    if root == nil{
        return 0
    }
    if root.Left == nil && root.Right == nil{
        return 0
    }
    sum := 0
    if root.Left != nil{
        sum += sumOfLeftLeaves(root.Left)
        if root.Left.Left == nil && root.Left.Right == nil{
            sum += root.Left.Val
        }
    }
    if root.Right != nil{
        sum += sumOfLeftLeaves(root.Right)
    }
    return sum
}

566.重塑矩阵-简单

题目描述:
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

题解:
遍历一遍矩阵就可以了,没什么简单方法

代码(Go):

func matrixReshape(mat [][]int, r int, c int) [][]int {
    m := len(mat)
    n := len(mat[0])
    if m * n != r * c{
        return mat
    }
    sce :=make([][]int,r)
    for i := range sce{
        sce[i] = make([]int,c)
    }
    for i := 0;i < m * n;i++{
        sce[i/c][i%c] = mat[i/n][i%n]
    }
    return sce
}

总结

看了一遍Morris算法,其他没什么意思,感觉明天开始可以试试每天一道中等题了

你可能感兴趣的:(leetcode刷题,leetcode,算法,golang)