力扣 二叉树的最大深度-104

二叉树的最大深度-104

class Solution {
public:int maxDepth(TreeNode* root) {return f(root,0);//调用函数f用先序遍历查找最长路径}int f(TreeNode* root,int sum){if(root == nullptr)return sum;int left = f(root->left,sum+1);/*遍历左子树,以当前节点的左子节点为根,当前深度sum+1作为新的深度参数调用f函数,这个过程会不断深入左子树,直到遇到左子树的叶子节点(root == nullptr),然后返回叶子节点向上回溯计算得到的左子树深度*/int right = f(root->right,sum+1);//完成左子树的深度计算时,开始递归遍历右子树,执行过程与遍历左子树相似return left > right ? left : right;//用于比较左子树的深度和右子树的深度,并返回较大的值,最后回到maxDepth函数,作为整棵树的最大深度。}
};

每日问题

解释一下宏定义和函数调用的区别

宏定义和函数调用的区别

一、定义方式:

1.宏定义是一种预处理指令,在编译之前,预处理器会对代码中的宏进行文本替换。例如,定义一个简单的宏来计算平方:

#define SQUARE(x) ((x)*(x))

这里SQUARE(x)是宏定义,当预处理器在代码中发现SQUARE(5)这样的表达式时,它会将其替换为 ((5)*(5))

2.函数是一段具有特定功能的独立代码块,有明确的参数列表和返回值类型(也可以是void无返回值)。例如:

int square(int x){return x*x;
}

这里定义了一个名为square的函数,它接受一个int类型的参数x,并返回x的平方

二、执行时机

1.宏展开是在编译预处理阶段进行的,在真正编译之前完成了文本替换。这意味着编译器看到的是替换后的代码。

2.函数调用是在程序运行时执行的。当程序执行到函数调用语句(如 int result = sqrare(5);)时,会跳转到函数的代码块执行,执行完后返回调用点继续执行后续代码

三、参数处理方式

1.宏定义中的参数没有类型检查。例如,在SQUARE宏中,如果写成SQUARE("abc"),预处理器依然会按照定义的规则进行替换,虽然这在实际的数学运算中没有意义,可能会导致编译错误,但预处理器不会像函数那样检查参数类型是否合适。

2.函数对参数有严格的类型检查。在上面的例子中,如果调用square函数时传入一个非int类型的参数(如double或char*等),编译器会发出类型不匹配的错误提示。

四、性能特点

1.对于简单的宏,因为它只是简单的文本替换,没有函数调用的开销(如参数传递、返回值处理等)。例如,如果在一个循环中频繁调用SQUARE宏来计算一个整数的平方,不会有函数调用的额外时间成本,但是,如果宏定义的内容很复杂,可能会导致生成的代码体积较大,因为每个使用宏的地方都会进行文本替换。

2.函数调用会有一定的开销,包括参数传递(可能涉及到参数的复制、栈帧的创建等)、返回值处理等。但是,函数的代码只存在一份,无论调用多少次,不会像宏那样因为多次使用而导致代码体积过度膨胀。

五、作用范围

1.宏定义的作用域通常从定义处开始,到文件末尾结束,除非被#undef指令取消定义。它不受函数作用域等的限制,本质上是一种文本替换规则,在预编译阶段全局生效。

2.函数有自己的作用域,函数内部定义的变量通常只在函数内部可见。函数可以通过返回值将结果返回给调用者,其作用范围和生命周期受到函数定义和调用规则的限制。

C/C++ 中的预处理器指令有哪些?举例说明其用途。

1.#include指令

用途:用于将指定的头文件内容包含到当前源文件中。头文件中通常包含函数声明、宏定义、类型定义等信息,这样可以在多个源文件中共享这些定义。

示例:

//在C++中包含输入/输出流头文件
#include<iostream>
//包含自定义头文件
#include"myheader.h"

对于这样的标准库头文件,编译器会在标准库路径中查找文件。而对于"myheader.h"这种自定义头文件,编译器通常会先在当前源文件所在目录查找,然后根据编译器设置的其他路径查找。通过包含iostream头文件,就可以使用cout和cin等表中输入输出流相关的功能。

2.#define指令

用途:用于定义宏。宏可以是一个简单的常量替换,也可以是带有参数的代码片段替换,它是一种文本替换机制,可以在编译前对代码进行简单的预处理。

示例-常量定义:

//定义一个常量PI
#define PI 3.14159

这样在代码中凡是出现PI的地方,预处理都会将其替换为3.14159。

示例-带参数的宏定义:

//定义一个宏来计算两个数的最大值
#define MAX(a,b)((a)>(b)?(a):(b))

在代码中使用MAX宏时,如int result = MAX(x,y);,预处理器会将其替换为((x)>(y)?(x):(y)),从而实现计算两个数最大值的功能。不过,带参数的宏可能会有一些潜在的副作用,比如多次求值等问题。

3.#ifdef、#ifndef、#endif指令

用途:用于条件编译。#ifdef用于检查某个宏是否已经定义,#ifndef用于检查某个宏是否未定义,它们通常与#endif一起使用,来控制一段代码是否参与编译。

示例:根据是否定义宏来包含不同代码:

//定义一个宏DEBUG
#include<iostream>
#define DEBUG
using namespace std;
//主函数
int main(){
#ifdef DEBUGcout << "Debugging information is enabled." << endl;
#elsecout << "This is a normal run." << endl;
#endifreturn 0;
}

在这个例子中,因为定义了DEBUG宏,所以#ifdef DEBUG条件成立,会输出Debugging information is enabled.。如果没有定义DEBUG宏,就会输出This is a normal run.。这种条件编译在调试代码、根据不同平台或配置包含不同功能代码等场景中非常有用

4.undef指令

用途:用于取消之前定义的宏。

示例:

#define PI 3.14159
//其他代码使用PI
//...
#undef PI
//这里之后PI就不再有之前的定义了

取消定义后,如果再使用PI,可能会导致编译错误(除非在后续代码中重新定义了PI)。这在需要重新定义一个宏或者在某个特定范围后不再使用某个宏时比较有用。

5.#pragma指令

用途:这是一个因编译器而异的指令,用于向编译器传达特定的信息或指令编译器执行某些特定的操作。不同编译器支持不同的#pargma用法。

//禁用4786号警告(VC++中可能是关于名字过长的警告)
#pragma warning(disable : 4786)

这个指令告诉Visuak C++编译器禁用编号为4786的警告。在其他编译器中,#pargma的用法可能不同,比如在GCC中可以用于控制代码的对齐等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12942.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

从代码到云端:使用PyCharm打包Python项目并部署至服务器的完整指南

从代码到云端&#xff1a;使用PyCharm打包Python项目并部署至服务器的完整指南 引言 随着云计算技术的发展&#xff0c;越来越多的开发者选择将自己的应用部署到云服务器上。对于Python开发人员来说&#xff0c;如何高效地将本地开发完成的应用程序迁移到远程服务器成为了一个…

【ComfyUI +BrushNet+PowerPaint】图像修复(根据题词填充目标)——ComfyUI-BrushNet

运行代码&#xff1a;https://github.com/nullquant/ComfyUI-BrushNet 源码1&#xff1a;https://github.com/TencentARC/BrushNet 源码2&#xff1a;https://github.com/open-mmlab/PowerPaint 上图&#xff0c;中间未 random_mask.safetensors结果&#xff0c;最右边图未segm…

(时序论文阅读)TimeMixer: Decomposable Multiscale Mixing for Time Series Forecasting

来源论文iclr2024 论文地址&#xff1a;https://arxiv.org/abs/2405.14616 源码地址&#xff1a; https://github.com/kwuking/TimeMixer 背景 数据是有连续性&#xff0c;周期性&#xff0c;趋势性的。我们这篇文章主要围绕的是用MLP结构来预测数据的周期性具体为&#xff…

大数据新视界 -- 大数据大厂之 Impala 性能优化:优化数据加载的实战技巧(下)(16/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

3196. I’m stuck!-13年12月CCF计算机软件能力认证

关键词 图通路&#xff0c;DFS/BFS 题目 思路 几点想说明的&#xff1a; 为什么要两个DFS&#xff1b;dfs1表示的是求从S出发能到达的所有的点&#xff1b;dfs2是考虑从T出发回溯&#xff0c;能到达的所有点&#xff0c;回溯去走&#xff0c;相当于此时T才是起点check函数&…

若依笔记(九):商城系统apk打包与调试

目录 env修改 nginx修改 apk打包 按照前文所述app版本保持2.2&#xff0c;使用uniapp作为生成工具&#xff0c;因为app版本涉及到登录、商品、支付&#xff0c;微信小程序打包需要企业主权限&#xff0c;所以使用apk打包&#xff0c;使用uniapp自带的云打包&#xff0c;本地…

算法练习记录

dp&#xff08;完全&#xff0c;线性&#xff0c;树状&#xff0c;状压&#xff0c;数位&#xff09;> 搜索 基础算法&#xff08;二分&#xff0c;前缀和&#xff0c;高精度&#xff0c;公约数&#xff0c;公倍数&#xff0c;质数&#xff0c;排序&#xff09; > 数据结…

深入浅出 ChatGPT 底层原理:Transformer

Transformer 在人工智能和自然语言处理领域,Transformer架构的出现无疑是一个里程碑式的突破。它不仅推动了GPT(Generative Pre-trained Transformer)等大型语言模型的发展,还彻底改变了我们处理和理解自然语言的方式。 GPT与Transformer GPT 近几年&#xff0c;人工智能技…

【C语言】js写一个冒泡顺序

用js写一个冒泡排序 当然可以。在JavaScript中&#xff0c;你可以使用递归的方式来实现冒泡排序算法。这是一个简单的示例&#xff1a; function bubbleSort(arr) { let len arr.length; if(len < 1){ return arr; // 如果数组只有一个元素或为空&#xff0c;直接返回 } //…

Leetcode3345. 最小可整除数位乘积 I

Every day a Leetcode 题目来源&#xff1a;3345. 最小可整除数位乘积 I 解法1&#xff1a;枚举 至多循环 10 次&#xff0c;一定会遇到个位数为 0 的数字&#xff0c;数位乘积是 0&#xff0c;一定是 t 的倍数。 所以暴力枚举即可。 代码&#xff1a; /** lc appleetcod…

element的from表单校验问题 —— 校验内容正确、但触发错误提示

问题&#xff1a;二次封装了el-radio&#xff0c;在选择后触发了form的校验&#xff0c;并提示了错误。 分析&#xff1a;输出radio选择后的value值是正确&#xff0c;但还是触发了错误校验提示&#xff0c;可能纯在以下几个问题 1. v-model 绑定的form参数和rules不一致 2. e…

工业相机选取

1.相机分类&#xff1a; 1.1 在相机曝光方式中&#xff0c;全局曝光和卷帘曝光是两种主流技术。CCD相机通常采用全局曝光方式&#xff0c;而CMOS相机则可能采用卷帘曝光。 面阵相机与全局曝光关联与区别 关联&#xff1a;面阵相机可以使用全局曝光作为曝光方式&#xff0c;但…

使用Windows自带的IIS搭建FTP服务端

1、启用IIS功能 2、打开IIS 3、将默认的站点删除 4、创建FTP服务端 &#xff08;1&#xff09;选中站点&#xff0c;然后点击鼠标邮件&#xff0c;点击添加FTP站点 &#xff08;2&#xff09;指定站点名称和物理路径 物理路径&#xff1a;FTP服务端数据的路径&#xff0c;F…

研界的福尔摩斯——扩增子+qPCR

微生物在生物地球化学循环、动植物健康等多种领域发挥作用&#xff0c;因此&#xff0c;精确测量微生物绝对丰度对理解其与人类健康、植物生长等的关系至关重要。 常规扩增子测序分析只能解析样本中的物种组成和其相对丰度信息&#xff0c;并不能反映样本每种微生物的真实数量…

期权懂|期权到期了,可以不行权吗?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权到期了&#xff0c;可以不行权吗&#xff1f; 期权到期后&#xff0c;投资者并非必须行权。如果行权无利可图或不符合预期收益&#xff0c;可以选择放弃行权&#xff0c;让期…

SL1571B 输入5V2A或单节锂电池,升压12V 10W 升压恒压芯片

一、概述 SL1571B是一款高功率密度的异步升压转换器&#xff0c;专为便携式系统提供高效且小尺寸的解决方案。它内置MOS管&#xff0c;具有120mΩ功率开关&#xff0c;支持宽输入电压范围&#xff0c;并具备多种保护功能。 二、主要特性 输入电压范围&#xff1a;SL1571B的输…

接口测试vs功能测试

接口测试和功能测试的区别&#xff1a; 本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什…

ubuntu20.04_从零LOD-3DGS的复现

环境要求 创建环境 conda create -n lod-3dgs python3.71. 安装CUDA11.6和相应cuDNN。 1.1 CUDA CUDA安装参考CUDA1&#xff1b;CUDA11.6&#xff0c;安装过程相似。 1.2 cuDNN 参考&#xff0c;下载对应版本后复制到对应CUDA里面。 cp cuda/lib64/* /usr/local/cuda-11…

IIS安装,Sql Server安装

在Windows操作环境下&#xff0c; 首先检查是否安装IIS&#xff0c;在“管理工具”中查看目录中是否存在Internet Information Services&#xff08;IIS&#xff09;的文件&#xff0c;存在则IIS已经安装成功。未安装则使用以下步骤&#xff1a; 1、使用winR打开控制面板&…

【LeetCode】【算法】64. 最小路径和

LeetCode 64. 最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 思路 思路&#xff1a;这种题太典了&#xff0c;典…