halo,大家下午好呀!今天羽毛球比赛,是的,不出意外。输的彻头彻尾,惨淡结束哈哈。明天我们宿舍打算去长乐沙滩上走走。下午买一杯香柠红茶,开始做题。本来打算刷简单题,但是我发现这样太慢了,先做做hot100,后续有时间再刷其他题目吧。近期事情很多,六级还没过,马上研二,压力也无形中大了起来,还得学学java,后面不行就转go。ok啦,收住,做题!
1、题目描述
2、逻辑分析
题目要求是给定一个二叉树,返回其最大深度。ok,五分钟过去了,我想不出来。看看题解先。题解给出的解决方案是:深度优先搜索和广度优先搜索。跟我昨天做的相同的树有些类似。下面直接来看看深度优先搜索使用递归的这个代码实现吧。
3、代码演示
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}else{
int leftH = maxDepth(root.left);
int rightH = maxDepth(root.right);
return Math.max(leftH , rightH ) + 1;
}
}
使用了递归的思想,从根结点出发,从左子树一直向下探,探到最深处后返回探右子树。最后的最大深度+1即可,因为还有一层是根结点这一层。大致思想就是这个啦。看看它的复杂度:
时间复杂度:O(n),空间复杂度:O(height)。
接下来我们一起来看看广度优先搜索这一方法的思路以及代码实现。这里的广度优先搜索与传统的不一样,抽象的说,就是一层一层的传结点,一层一层的看,这样抽象出来就只用知道它一共有多少层,即树的最大深度。All right,下面来看具体代码怎么实现的。
public int maxDepth(TreeNode root) {
if (root == null){
return 0;
}
Queue <TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
int sum = 0;
while(!queue.isEmpty()){
int size = queue.size();
while(size >0){
TreeNode node = queue.poll();
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
size--;
}
sum ++;
}
return sum;
}
这里代码虽然多,但是比递归好理解一些,这里的关键点有:
- 使用队列queue来进行广度优先搜索。
- size变量用于记录当前层的节点数量,确保每次只处理同一层的节点。
- 在遍历完当前层的所有节点后,深度计数器ans加一,表示进入下一层。
- 当队列为空时,说明所有节点都已遍历完毕,此时返回深度计数器ans的值,即为树的最大深度。
时间复杂度:O(n),空间复杂度:O(height)。
以上的两种解法,我都放在IDE中打断点一步步的验证,看看底层是如何进行的,虽然还是没有完全理解,但是也很高效的帮助我学到了一步步怎么来的。ok啦,还有一题留给饭后散步后的我吧,我得做其他事情啦!BYE!