代码随想录算法训练营第十六天/104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

本文详细探讨了二叉树的深度和高度概念,并结合LeetCode的104.二叉树的最大深度、111.二叉树的最小深度和222.完全二叉树的节点个数三个问题,阐述了解题思路。通过前序遍历和后序遍历来计算最大深度和最小深度,同时强调了计算时需要额外加1的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树深度与高度辨析

深度:我自己是将这个理解为:水深,那么深度就是从水面到底算的,所以深度是从上到下的;联系到二叉树就是由上向下反馈高度或其他,所以也就是:中左右,相关问题用前序遍历。

高度:我将高度理解为:楼高,从最下层往上的高度,就是从下往上反馈,那就是符合:左右中,高度相关问题用后序遍历。


104.二叉树的最大深度

1.思路

首先求深度,那考虑前序遍历,但是就此题而言,最大深度与高度是一样的,所以可以选择用前或后序遍历。
我使用前序遍历来完成:当当前节点为空时,返回的高度为0;不为空时是将当前节点的左右子树深度递归得出结果,然后返回两者中最大的深度加1,加1是因为算的深度是当前节点的子树高度,而没有算自己,所以要加上。

2.注意

(1)遍历方式
(2)最后要加1,表示算上当前的这个节点

3.实现代码

class Solution {
    public int maxDepth(TreeNode root) {
        //当节点为空,返回的长度为0
       if(root==null){
           return 0;
       }
       int highleft=maxDepth(root.left);
       int highright=maxDepth(root.right);
       return Math.max(highleft,highright)+1;
    }
}

111.二叉树的最小深度

1.思路

最小深度比起最大深度要复杂得多,要多考虑几个问题!
首先当节点为空时,返回的深度为0,然后要分开三种情况讨论:1.当根节点的左子树为空时,而右子树不为空,那么返回的就是当前节点右子树的深度+1;2.当根节点的右子树为空,而左子树不为空时,返回左子树的深度+1;3.当左右子树都不为空时,返回两者中最小的加1.

2.注意

1.当左右子树有一个为空的情况,可以画图理解,当有一个为空时,可能会误将根节点当成最小深度,但是这是错误的。
2.还是要加上1的问题,加上的是当前节点的深度。

3.实现代码

class Solution {
    public int minDepth(TreeNode root) {
        if(root==null){
            return 0;
        }
        int left=minDepth(root.left);
        int right=minDepth(root.right);

        if(root.left==null&&root.right!=null){
            return right+1;
        }
        if(root.left!=null&&root.right==null){
            return left+1;
        }
        return Math.min(left,right)+1;      
    }
}

222.完全二叉树的节点个数

思路

总节点个数包括:根节点+左子树数量+右子树数量,先分别递归计算出左右子树个数,然后返回两者之和再加1。

注意

强调强调就是加1,因为计算的是当前节点的左右子树的个数,是没有算这个节点的,所以需要加1。

实现代码

class Solution {
    public int countNodes(TreeNode root) {
     if(root==null){
         return 0;
     }
     int countleft=countNodes(root.left);
     int countright=countNodes(root.right);
     return countleft+countright+1;
    }
}

总结

本次的题目区分了高度与深度;然后就是为什么要加1?因为都是按照先计算当前节点的左右子树获得的值,这个节点是没有算的,所以最后要加上它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值