分享
  1. 首页
  2. 文章

Golang面试题:二叉树的最大深度

ppmoon · · 1840 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

问题:求二叉树的最大深度

给定一个二叉树,返回其最大深度。
示例:

 1
 / \
 2 3
 / \ / \
 4 5 6 7

返回最大深度为3

解题思路

利用深度优先或者广度优先遍历二叉树,找到树的最大深度。

二叉树的结构体

type TreeNode struct {
 left *TreeNode // 左子节点
 right *TreeNode // 右子节点
 value int // 值
}

深度优先搜索

主要思路

1.深度优先搜索和二叉树的前序遍历比较类似。
2.利用递归的方式不停下探树的深度。
3.递归的终止条件是如果节点为空就返回0。然后判断左右子树最大值同时加1来表示当前节点的高度。

func maxDepth(root *TreeNode) int {
 // 如果节点为空就不再递归下探深度
 if root == nil {
 return 0
 }
 left := maxDepth(root.left)
 right := maxDepth(root.right)
 if left > right {
 return left + 1
 }
 return right + 1
}

时间复杂度:O(n)其中n为节点数量。因为每个节点都要访问一次
空间复杂度:O(logN)其中N是节点数量。在树不是平衡的情况下,空间复杂度是O(N),比如树比较瘸腿一路左子树的情况下。但是如果树比较平衡的情况下空间复杂度是O(logN)。

广度优先搜索

主要思路

1.广度优先搜索利用迭代的方式将每一层的节点都放入到队列当中。
2.队列出队清空进入下一层。
3.利用一个变量来标记深度。每次进入下一次都给这个变量加1来记录深度。

func maxDepth(root *TreeNode) int {
 // 根节点如果为0直接返回0
 if root == nil {
 return 0
 }
 queue := make([]*TreeNode,0) // 创建一个队列
 queue = append(queue,root) // 把根节点放入队列
 depth := 0 // 声明深度变量
 for len(queue) > 0 { // 队列里有值就一直循环
 size := len(queue) // 这里要把当前一层的队列遍历一遍全部出队
 for i:=0;i<size;i++{
 v := queue[0]
 queue = queue[1:] // 出队
 if v.left != nil {
 queue = append(queue,v.left) // 如果有左子树,就左子树入队
 }
 if v.right != nil {
 quque = append(queue,v.right) // 如果有右子树,就右子树入队
 }
 }
 depth++ // 清出一层后给变量加1
 } 
 return depth
}

时间复杂度:O(n),n代表节点,每一个节点都要遍历一遍。
空间复杂度:O(n),最坏的情况下,队列当中装满了一层的节点。

如有错误,欢迎指正和讨论。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:ppmoon

查看原文:Golang面试题:二叉树的最大深度

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1840 次点击
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏