这是树的第8篇算法,力扣链接。
给定一个二叉树
root
,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:3
这道题还是可以用层级遍历来解,每一层count++即可。
func maxDepth(root *TreeNode) int {count := 0if root == nil {return count}queue := []*TreeNode{root}for len(queue) > 0 {count++newQueue := []*TreeNode{}for _, node := range queue {if node.Left != nil {newQueue = append(newQueue, node.Left)}if node.Right != nil {newQueue = append(newQueue, node.Right)}}queue = newQueue}return count
}
当然,也可以深度优先遍历,递归的方式:
func maxDepth(root *TreeNode) int {if root == nil {return 0}left, right := maxDepth(root.Left), maxDepth(root.Right)if left > right {return left + 1} else {return right + 1}
}
迭代的方法也能做,不过要构建新对象记录深度。
func maxDepth(root *TreeNode) int {if root == nil {return 0}// 定义一个栈,用于存储节点以及对应的深度type StackNode struct {Node *TreeNodeDepth int}// 初始化栈,先将根节点入栈stack := []StackNode{{Node: root, Depth: 1}}maxDepth := 0// 当栈不为空时,循环执行for len(stack) > 0 {// 出栈current := stack[len(stack)-1]stack = stack[:len(stack)-1]// 如果当前节点的深度大于已记录的最大深度,则更新最大深度if current.Depth > maxDepth {maxDepth = current.Depth}// 将当前节点的子节点入栈,深度为当前节点深度加1if current.Node.Left != nil {stack = append(stack, StackNode{Node: current.Node.Left, Depth: current.Depth + 1})}if current.Node.Right != nil {stack = append(stack, StackNode{Node: current.Node.Right, Depth: current.Depth + 1})}}// 返回记录的最大深度return maxDepth
}