二叉树的最大深度|Go主题月

3,075 阅读2分钟

【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

😄

 \color{red}{~}

我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕

应该会超过一部分的面试者。

leecode 104. 二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例: 给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。

图片.png


如果我们知道了左子树和右子树的最大深度 ll 和 rr,那么该二叉树的最大深度即为

max(l,r)+1

而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。

参考代码

定义一颗树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int          // 根
 *     Left *TreeNode   //左节点
 *     Right *TreeNode  //右节点
 * }
 */

GO语言版 递归

  1. 要知道这是一棵树,只是通过数组的形式表现出来的

    直接递归到最左边和最右边,取较大值。

func maxDepth(root *TreeNode) int {
    if root == nil {
        return 0
    }
    return max(maxDepth(root.Left), maxDepth(root.Right)) + 1  // 1.
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

迭代版

  1. 定义一个队列(先进先出)

  2. 将整颗树怼进队列中

  3. 获取队列的长度,判断是否为空

  4. 判断队列的长度

  5. 取出队列里的一个元素

  6. 队列里的元素如果左节点不为空,则继续添加道队列里

  7. 队列里的元素如果右节点不为空,则继续添加道队列里

  8. 既然在第5步取了一个元素出来,那么就减少一个元素,当元素=0时回到第3步,重新获取队列长度,没回去一次,深度就加1.

  9. 深度加1.

func maxDepth(root *TreeNode) int {
    if root == nil {
        return 0
    }
    queue := []*TreeNode{}   // 1.
    queue = append(queue, root)   // 2. 
    ans := 0
    for len(queue) > 0 {  // 3. 
        sz := len(queue)
        for sz > 0 {  // 4. 
            node := queue[0]  // 5. 
            queue = queue[1:]  
            if node.Left != nil {  // 6. 
                queue = append(queue, node.Left)
            }
            if node.Right != nil {  // 7.
                queue = append(queue, node.Right)
            }
            sz--   // 8.
        }
        ans++  // 9.
    }
    return ans
}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️