104二叉树的最大深度-简单
题目:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
分析:
算法1:递归
// 算法一: 递归,采用自底向上的递归思想
// 时间复杂度O(N),空间复杂度O(NlogN)
// 自底向上的递归
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
l, r := maxDepth(root.Left), maxDepth(root.Right)
if l > r {
return l+1
}
return r+1
}
算法2:dfs深度优先搜索
这里跟递归算法其实是一样的,只不过中间过程记录一个深度值 depth, 初始为零。
当遇到空节点,直接返回 depth;否则递增
如果当前节点为叶子节点,返回depth
否则分别搜索左子树和右子树,返回其中的最大值
// 算法2 dfs深度优先搜索
// 时间复杂度O(N),空间复杂度O(NlogN)
// 自顶向下的递归
func maxDepth(root *TreeNode) int {
var dfs func(root *TreeNode, depth int) int
dfs = func(root *TreeNode, depth int) int {
if root == nil {
return depth
}
depth++
l, r := dfs(root.Left, depth), dfs(root.Right, depth)
if l > r {
return l
}
return r
}
return dfs(root, 0)
}
算法3:bfs广度优先搜索
所谓广度优先搜索,其实就是层序遍历的思路,当遍历到最后一层时,即为最大深度。
// 算法3
// bfs广度优先搜索
// 时间复杂度O(N),空间复杂度O(N)
func maxDepth(root *TreeNode) int {
if root == nil {return 0}
queue := make([]*TreeNode, 0)
queue = append(queue, root)
depth, n := 0, 0
// 判断是否还有新的一层
for len(queue) != 0 {
n = len(queue)
// 从上一层中取节点,并查看其左右子树
for i := 0; i < n; i++ {
if queue[i].Left != nil {
queue = append(queue, queue[i].Left)
}
if queue[i].Right != nil {
queue = append(queue, queue[i].Right)
}
}
queue = queue[n:]
depth++
}
return depth
}
最后更新于