代码随想录Day16 | 104二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

从Wi-Fi到蓝牙:手把手教你用Cadence Virtuoso搭建一个2.4GHz锁相环频率综合器(含PFD/CP/VCO模块设计) 本文详细介绍了如何在Cadence Virtuoso中设计一个2.4GHz锁相环频率综合器(PLL),涵盖从系统架构到模块级设计的全流程。重点解析了PFD、CP和VCO等核心模块的设计技巧与仿真验证方法,帮助模拟集成电路设计师掌握高频PLL的实现要点,满足Wi-Fi和蓝牙等无线通信标准的要求。 阅读详情

代码随想录Day16 | 104二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

二叉树的最大深度

文档讲解:代码随想录
视频讲解:
状态: 之前用层序遍历解决了,这次学习迭代方法

求解过程中,采用的是前序还是后序的遍历主要看最终结果的处理逻辑,因为我们处理逻辑一般都是放在中节点上进行的,即判断这一个节点目前的深度。
而本题可以使用后序的原因就在于其是根节点,根节点的高度和深度相等。我们来观测后序求高度的代码

int left = getheight(cur->left);
int right = getheight(cur->right);
int mid = 1+max(left,right);

中节点的高度是由左节点和右节点高度来计算的
我们再来看前序遍历,就是直接求深度的过程,原理就是每到达左节点或者右节点深度+1,在递归中我们需要传入这个深度作为参数,这个深度相当于就是计数器,记录当前另一个参数就是节点所在的层数。

//前序
int mid = 0;//mid为返回结果,不能每层更新为0,每层使用dep更新
//中节点
mid = dep > mid ? dep : mid;
//左节点
if(cur->left)
{
	//此时说明深度需要加1 ,
	dep++;
	getdepth(cur->left,dep);//以当前层的左节点为中节点开始迭代
	//回溯,因为这个操作是在中节点位置
	dep--;
}if(cur->right)
{
	//此时说明深度需要加1 ,
	dep++;
	getdepth(cur->right,dep);//以当前层的右节点为中节点开始迭代
	//回溯,因为这个操作是在中节点位置
	dep--;
}

除了递归中需要改变深度,其他操作都相当于在同一层操作,需要保持深度的不变性。

二叉树的最小深度

文档讲解:代码随想录
视频讲解:
状态:同样之前用层序遍历

层序遍历就是要注意跳出循环的时机,每层循环都++,然后当左节点和右节点都为空时,再++然后return 这个值。

class Solution {
public:
    int minDepth(TreeNode* root) {
        queue<TreeNode*> treeque;
        if(root) treeque.push(root);
        int count = 0;
        while(!treeque.empty())
        {
            int tempsize = treeque.size();
            for(int i=0;i<tempsize;i++)
            {
                TreeNode* cur = treeque.front();
                treeque.pop();
                if(cur->left == nullptr&&cur->right == nullptr) return count+1;
                if(cur->left) treeque.push(cur->left);
                if(cur->right) treeque.push(cur->right);
            }
            count++;
        }
        return count;
    }
};

递归:要注意只有左右节点都是空的时候,才能说明该节点是叶子节点,如果左节点为空右节点不为空,那么最小深度应该是1+右节点的迭代。

class Solution {
public:
    int getHeight(TreeNode* root)
    {
        if(root == nullptr) return 0;
        int left = getHeight(root->left);
        int right = getHeight(root->right);

        //当left null right不为Null时
        if(root->left == nullptr && root->right != nullptr)
        {
            return 1+right;
        }
        if(root->right == nullptr && root->left != nullptr)
        {
            return 1+left;
        }

        return 1+min(left ,right);
    }

public:
    int minDepth(TreeNode* root) {
        return getHeight(root);
    }
};

完全二叉树的节点个数

文档讲解:代码随想录
视频讲解:
状态

递归,记录每一个左节点和右节点,迭代的变化量就是节点个数而不是节点深度了。

class Solution {
public:
    int getNum(TreeNode* root)
    {
        if(root == nullptr) return 0;
        //左节点的子树中节点的个数
        int left = getNum(root->left);
        //右节点的子树中节点的个数
        int right = getNum(root->right);
        //中节点的节点个数计算,1表示中节点
        int mid = 1+left+right;
        return mid;
    }
public:
    int countNodes(TreeNode* root) {
        return getNum(root);
    }
};

利用完全二叉树的特性,所有子树都可以划分为满二叉树和不满的完全二叉树,对于满二叉树那就是从父节点开始一直只遍历左节点和只遍历右节点,如果长度相等那说明是满的,此时节点个数就是 2 n − 1 2^n-1 2n−1,如果是不满的,那么就继续递归直到最后为满二叉树,一个节点的二叉树也是满的。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int getNum(TreeNode* root)
    {
        //终止条件
        //1.root == nullptr
        if(root == nullptr) return 0;
        //2. 遍历左节点个数和右节点个数相等,即这个子树是满二叉树
        TreeNode* left = root->left;
        TreeNode* right = root->right;
        int leftlen = 0;
        int rightlen = 0;
        while(left)
        {
            leftlen++;
            left = left->left;
        }
        while(right)
        {
            rightlen++;
            right = right->right;
        }
        if(leftlen == rightlen)
        {
            return (2<<leftlen)-1;
        }

        //递归单层逻辑
        int leftnode = getNum(root->left);
        int rightnode = getNum(root->right);
        int mid = 1+leftnode+rightnode;
        return mid;
    }
public:
    int countNodes(TreeNode* root) {
        return getNum(root);
    }
};

时间复杂度:相当于二分法,首先假设二叉树节点为n,那么对每个左节点或者右节点递归调用时间复杂度为 O ( l o g n ) O(log n) O(logn),而对每个左节点或者右节点有需要遍历其子树的左节点和右节点 O ( l o g n ) O(log n) O(logn),所以总时间复杂度就是 O ( l o g 2 n ) O(log^2n) O(log2n)

audio框架学习-Audio_Flinger分析 文章目录一、代码位置二、audio服务启动2.1 main服务2.2 audioflinger添加到系统服务中2.3 audioflinger的对外接口 之前记录过audioTrack的笔记,这次继续参考audioFlinger相关的代码并做笔记; 参考文档:https://www.cnblogs.com/innost/archive/2011/01/15/1936425.html和https://blog.csdn.net/zyuanyun/article/details/60890534?spm=100 阅读详情

相关推荐

深入MoveIt与OMPL集成开发:从源码编译到自定义规划算法实战

本文详细介绍了如何从源码编译集成MoveIt与OMPL,并实现自定义规划算法的完整流程。通过清理环境、获取源码、解决编译依赖与错误,最终指导开发者创建并集成名为MyRRT的自定义规划算法,从而实现对机器人运动规划栈的深度定制与优化。

h0i1j2k3l的博客 467

代码随想录刷题day16 104.二叉树的最大深度;111.二叉树的最小深度;222.完全二叉树的节点个数

代码随想录刷题day16

weixin_43127049的博客 317

如何适配自定义激光雷达数据到LIO-SAM:解决ring和time参数缺失问题

本文详细解析了如何将非标准激光雷达(如速腾、Livox)适配到LIO-SAM框架中,重点解决ring和time参数缺失问题。提供了从源码修改到通用适配中间件的多层级解决方案,并包含实机测试与性能调优指南,帮助开发者高效完成雷达数据适配。

weixin_42551227的博客 421

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

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

qq_41929830的博客 926

ESXI 7 :创建统信V20_1050d服务器系统虚拟机

记录一下在 X86 架构创建统信V20_1050d 虚拟机遇到的问题。已遇到的问题有①:常规服务器环境下网络连接失败重点:按照桌面版本,有问题处理简单。

guyuelin123的博客 1967

图像修复黑科技:对比BM3D/DnCNN等5种去噪器在PNP框架中的实战效果

本文深度评测了BM3D、DnCNN等五款主流去噪器在即插即用(PnP)优化框架中的实战表现。通过量化指标、视觉对比及超分等泛化任务测试,揭示了深度学习模型在性能与收敛速度上的优势,并为不同应用场景提供了选型指南与工程化建议。

weixin_29065959的博客 368

代码随想录算法训练营DAY16|C++二叉树Part.3|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

确定终止条件:如果为空结点的话,就返回0,表示高度为0 确定单层递归逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的值,再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。 CPP代码 ⭐️精简后的代码如下: 精简之后的代码根本看不出是哪种遍历方式,也看不出递归三部曲的步骤,所以如果对二叉树的操作还不熟练,尽量不要直接照着精简代码来学。本题和上一题思想很类似,但是有一个细节需要我们讨论。使用递归遍历的话,再确定单层递归逻辑很容易写成: 这个代码就出现了错误!如

糖炒栗子 1274

一条 POST 创建整棵业务对象树,SAP Gateway Deep Create 的运行机制与 ABAP 实现

SAPUI5 的 OData V2 Model 支持 Deep Create,可以为一个新建的 transient parent context 创建 Navigation Property 下的 subentity,并把这些子实体的数据合并进 Root Entity 对应的 OData 请求 Payload。销售组织是否合法,客户是否允许下单,物料是否存在,销售区域是否匹配,计量单位是否正确,项目类别如何确定,定价是否成功,合作伙伴如何派生,交货工厂如何确定,这些都可能在一次创建过程中被触发。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 146

代码随想录算法训练营day16|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

今天这些题目用层序遍历都能很快解决,但效率一般。首先需要明确几个知识点。:(一般采用前序遍历方式):(一般采用后序遍历方式)

github_35852648的博客 866

AI原生应用架构师指南:系统化思维框架解析

随着ChatGPT、Stable Diffusion等AI技术的普及,「AI原生应用」(AI-Native Application)已从概念走向实践。传统应用以「功能逻辑」为核心(比如用代码写死的购物车规则),而AI原生应用以「数据+模型」为核心(比如根据用户行为动态推荐商品)。本文的目的是为架构师提供一套系统化思维框架如何区分「伪AI应用」和「真AI原生应用」?数据、模型、业务场景三者如何协同设计?架构师需要关注哪些关键技术节点?如何避免「为了AI而AI」的陷阱?

AI Python 编程之道的博客 491

玩转Docker小游戏项目系列: Docker部署中国象棋网页小游戏

玩转Docker小游戏项目系列: Docker部署中国象棋网页小游戏

jks212454的博客 440

代码随想录Day16|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

weixin_46620779的博客 2076

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

代码随想录【day 16 二叉树】| 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

代码随想录【day 16 栈与队列】| 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

weixin_43891814的博客 1387

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

代码随想录刷题笔记 DAY16 | 二叉树的最大深度 No.104 | 二叉树的最小深度 No.111 | 完全二叉树的节点个数 No.222

1,所以可以只遍历两个外层的节点,如果发现两个外层的层数(深度)相同的话,就说明是一个满二叉树,这个结论仅在满足二叉树是完全二叉树的时候成立,如上图,如果两个外侧的节点数相同,则因为完全二叉树的性质,红圈部分一定有节点。再来尝试利用完全二叉树的性质,完全二叉树的定义在前面博客中提到过,这里简单介绍一下,完全二叉树是除了倒数第二层以外,其他的位置都有两个子节点,且最后一层有节点的位置是连续的,利用这个性质可以少遍历一些节点。为例,如果要记录该节点的深度,就应该在前序位置(刚进入节点的位置)执行。

kkq的博客 1073

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

代码随想录【Day16】| 104. 二叉树的最大深度、111. 二叉树的最小深度、222. 完全二叉树的节点个数

二叉树的遍历,完全二叉树、满二叉树的性质

傅里叶变不出的博客 564

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

LeetCode | 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

weixin_69675605的博客 997

【力扣一刷】代码随想录day16 (104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数)【递归版】

目的是计算当前节点的深度和当前的最大深度,因此需要传入当前节点和父节点的深度。由于是前序遍历,先获取的当前节点/中节点的深度,再获取左右节点的深度,此时左右节点的深度返回没有意义。父节点的最大高度 = 左右子节点高度的最大值 + 1(需要先访问左右节点,再访问中节点,所以对应的是后序遍历)如果不是,继续遍历左节点和右节点,当前节点对应子树的所有节点数 = 左右子树所有节点之和 + 1。确定单层递归逻辑:获取当前节点/父节点的高度,即要获取左右子节点的最大高度再+1。

weixin_46135891的博客 1100

代码随想录三刷 day16 | 二叉树之104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

baimaozi_007的博客 839

代码随想录算法训练营 DAY 16 | 104.二叉树最大深度 111.二叉树最小深度 222.完全二叉树的节点个数

把左和右递归遍历的操作放到一个for循环里,遍历node.children 得到depth,最后return depth+1即可!对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。核心思路:利用完全二叉树特性,因为题目是完全二叉树,直接全部遍历左孩子和右孩子,如果高度相等它就是满二叉树,直接。完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。

qq_35904005的博客 1077

小白刷代码随想录day16--104.二叉树的最大深度 559.n叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数

Leetcode 104.二叉树的最大深度 559.n叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数

RoyUp8011的博客 1832

零基础代码随想录【Day16】|| 104.二叉树的最大深度 ,111.二叉树的最小深度,222.完全二叉树的节点个数

对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

Andrew______的博客 438

代码随想录Day16——104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

给定一个二叉树root,返回其最大深度。二叉树的是指从根节点到最远叶子节点的最长路径上的节点数。Day15中通过层序遍历的方法解了这道题目,今天使用后序遍历递归的方法。

cheng_dog的博客 1129

代码随想录算法训练营Day 16|LeetCode104 二叉树的最大深度、LeetCode559 n叉树最大深度、eetcode111 二叉树的最小深度、Leetcode222 完全二叉树的节点个数

下图中的例子便需要特殊讨论①若左子树为空,右子树不为空,则最小深度为1+右子树最小深度;②若右子树为空,左子树不为空,则最小深度为1+左子树最小深度;③若左右子树都不为空,则最小深度为1+min(左子树最小深度,右子树最小深度)。求二叉树最小深度看似与求最大深度类似,实则处理起来还是更麻烦一些:最小深度概念为。与求深度类似,采用后序遍历,将max换成求和,递归后即可得完全二叉树的节点个数。空间复杂度:O(height) height为二叉树高度。空间复杂度:O(height)时间复杂度:O(n)

qq_52807368的博客 1661

代码随想录day16|104.二叉树的最大深度|559.n叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数

笔记

weixin_42161901的博客 738

【代码随想录算法训练营Day16】● 104.二叉树的最大深度;●559.n叉树的最大深度;● 111.二叉树的最小深度;● 222.完全二叉树的节点个数

所以只需要对单条腿的二叉树进行条件判断,只有右子树就按左子树深度算,只有左子树就按右子树深度算。当遍历到叶子节点(即没有左节点也没有右节点)时,当前层数就是最小深度,其他思想与最大深度相同。如果根据求二叉树最大深度的递归代码来写的话,一条腿的二叉树最小深度就是0了,不符合题意。通过层序遍历先判断每一层有几个元素,通过将每一层套进一个循环,计算循环次数即可。

Tammy2001的博客 958

代码随想录算法训练营Day16|Leetcode104二叉树的最大深度、Leetcode559n叉树的最大深度、Leetcode111二叉树的最小深度、Leetcode222完全二叉树的节点个数

Day16打卡!今日感想:今天依旧是用递归法解决二叉树中深度和高度有关的问题,要学会融会贯通~

m0_60979177的博客 1205
上一篇: 代码随想录Day15 | 层序遍历,翻转二叉树,对称二叉树
下一篇: 代码随想录Day 17 | 110 平衡二叉树 257 二叉树的所有路径 404 左叶子之和
sRiddle
博客等级 码龄7年 528粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值