LeetCode刷题之HOT100之二叉树的最大深度

halo,大家下午好呀!今天羽毛球比赛,是的,不出意外。输的彻头彻尾,惨淡结束哈哈。明天我们宿舍打算去长乐沙滩上走走。下午买一杯香柠红茶,开始做题。本来打算刷简单题,但是我发现这样太慢了,先做做hot100,后续有时间再刷其他题目吧。近期事情很多,六级还没过,马上研二,压力也无形中大了起来,还得学学java,后面不行就转go。ok啦,收住,做题!

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求是给定一个二叉树,返回其最大深度。ok,五分钟过去了,我想不出来。看看题解先。题解给出的解决方案是:深度优先搜索和广度优先搜索。跟我昨天做的相同的树有些类似。下面直接来看看深度优先搜索使用递归的这个代码实现吧。

3、代码演示

 public int maxDepth(TreeNode root) {
        // 检查根节点是否为空  
        // 如果根节点为空(即树是空的或者当前子树为空),则返回深度为0 
        if(root == null){
            return 0;
        }else{
            // 递归调用maxDepth函数,计算左子树的最大深度
            int leftH = maxDepth(root.left);
            // 递归调用maxDepth函数,计算右子树的最大深度
            int rightH = maxDepth(root.right);
            // 比较左子树和右子树的最大深度,取其中较大的值  
            // 然后加上当前节点所在的层级(即1),因为当前节点也是一个层级  
            // 所以整个树的最大深度是左子树或右子树的最大深度加1  
            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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值