题目
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
分析
使用递归,很容易写出该求解算法,思路也简单,就是左子树和右子树高度,取两者最大,然后在此基础上加1即可,如下图所示,差不多1到2行代码。
public int maxDepth(TreeNode root) {
return root == null ? 0 : Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
然而,递归使用不当,会有风险,毕竟递归栈的深度非常有限,假如一棵接近线性化的二叉树,也就是严重一侧倾斜,退化成接近一个单链表
5
/ \
1 2
\
3
/
5
\
6
\
8
......
当二叉树的深度高达数千甚至上万的时候,使用递归,那是一定会栈溢出的!因此,在栈深度较深乃至于不可控时,我们需要另想办法,取代递归。
解决方案
我们可以采用层次遍历的方式,遍历完一层,我们就将深度加1,直到遍历完二叉树的所有层后,深度自然也就出来了。这个思路的实现,很明显可以使用迭代的方式。下面的是代码
public static int maxDepth2(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int depth = 0;
while (!queue.isEmpty()){
//得到这一层的node个数
int levelNodeSize = queue.size();
//取完这一层,并下一层的node也就全部放进去
while (levelNodeSize > 0){
TreeNode node = queue.poll();
if(node.left != null)
queue.offer(node.left);
if(node.right != null){
queue.offer(node.right);
}
levelNodeSize--;
}
depth++;
}
return depth;
}
1416

被折叠的 条评论
为什么被折叠?



