「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。
描述
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
做题
深度优先/递归法
第一种做法就是从根节点一直遍历到叶子节点,然后比较树的深度,获取最大深度。
通过递归,先遍历左子节点,一直遍历到叶子节点,然后返回,每往上一层深度就 +1,这里把深度理解为高度会比较好。
3
/ \
9 20
/ \
15 7
像这里的节点(20),它的高度就取节点(15) & (7) 高度的最大值,如果 (15) 下面还有节点,组成的高度是 2,而 (7) 下面没有节点了,高度就是 1,那节点 (20) 的高度就是 2 + 1。
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
int depth1 = maxDepth(root.left);
int depth2 = maxDepth(root.right);
return depth1>depth2?(depth1 + 1):(depth2 +1);
}
广度优先/迭代法
这种做法是一层一层地遍历二叉树,直到没有叶子节点了。
3
/ \
9 20
/ \
15 7
第一次遍历的就是 (3),深度 + 1,发现它还有左右子节点。
第二次遍历的就是 (9,20),深度 + 1,发现 (20)有左右子节点。
第三次遍历的就是 (15,7),深度 + 1,都没有左右子节点了。
我们可以使用一个队列把要遍历的节点都存起来,每次要开始遍历时就记录一下要遍历几个,后面在遍历途中增加的节点就不要遍历了。
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
int depth = 0;
Queue<TreeNode> queue = new LinkedList();
queue.offer(root);
while(queue.size()!=0){
int size = queue.size();
while(size>0){
TreeNode item = queue.poll();
if(item.left !=null){
queue.offer(item.left);
}
if(item.right !=null){
queue.offer(item.right);
}
size--;
}
//每遍历完一层,深度 +1
depth++;
}
return depth;
}
最后
这两种做法基本上都是需要把整颗二叉树遍历一遍,这种题也是要这样,没办法,内存消耗上相差不大。
今天就到这里了。
这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。