给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
_____________________________________________________________________________________________________
找最大深度,采用递归的解法:
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
l := maxDepth(root.Left)
r := maxDepth(root.Right)
if l<r {
return r+1
}
return l+1
}
对递归思路一些思考:递归实际上是一个自底向上的过程,所以我们可以思考每个递归的作用,以及对倒数第一层和倒数第二层的影响,然后总结出规律。
像本题的maxDepth()函数的作用就是,返回每个以root为根节点的二叉树的最大深度,然后向上返回,再+1。
比如,如果有二叉树是:
1
/ \
2 3
则对最后一层的节点2和3分别调用maxDepth(),它们的子节点为nil,则返回0;2,3分别向上返回1,1给节点1,则1进行汇总,返回1+1 = 2.
贴一个 leetcode 实例代码,用了迭代和递归,感觉很不错。
//循环,自顶向下,根左右
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
answer := 0
queue := []*TreeNode{ root }
for len(queue) > 0 {
node := []*TreeNode{}
temp := 0
for _, p := range queue {
if p.Left != nil {
node = append(node, p.Left)
}
if p.Right != nil {
node = append(node, p.Right)
}
temp++
}
if temp > 0 {
answer++
}
queue = node
}
return answer
}
//自底向上
// 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
// }
//自顶向下,根左右,前序遍历
// func maxDepth(root *TreeNode) int {
// var answer int
// var helper func(node *TreeNode, depth int)
// helper = func(node *TreeNode, depth int) {
// if node.Left == nil && node.Right == nil {
// if depth > answer {
// answer = depth
// }
// }
// if node.Left != nil {
// helper(node.Left, depth + 1)
// }
// if node.Right != nil {
// helper(node.Right, depth + 1)
// }
// }
// if root != nil {
// helper(root, 1)
// }
// return answer
// }