【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.
😄
我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕
应该会超过一部分的面试者。
leecode 104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。
如果我们知道了左子树和右子树的最大深度 ll 和 rr,那么该二叉树的最大深度即为
max(l,r)+1
而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。
参考代码
定义一颗树
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int // 根
* Left *TreeNode //左节点
* Right *TreeNode //右节点
* }
*/
GO语言版 递归
-
要知道这是一棵树,只是通过数组的形式表现出来的
直接递归到最左边和最右边,取较大值。
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
}
迭代版
-
定义一个队列(先进先出)
-
将整颗树怼进队列中
-
获取队列的长度,判断是否为空
-
判断队列的长度
-
取出队列里的一个元素
-
队列里的元素如果左节点不为空,则继续添加道队列里
-
队列里的元素如果右节点不为空,则继续添加道队列里
-
既然在第5步取了一个元素出来,那么就减少一个元素,当元素=0时回到第3步,重新获取队列长度,没回去一次,深度就加1.
-
深度加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块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️