力扣 二叉树的直径-543

二叉树的直径-543

class Solution {
int Max = 0;//定义一个整形变量Max用来记录遍历二叉树中发现最大直径值
public:int diameterOfBinaryTree(TreeNode* root) {f(root);//定义一个用来求最大直径的函数return Max;}int f(TreeNode* root){//结束条件,如果访问到叶子节点的子节点,返回0if(root == nullptr)return 0;/*遍历左子树去计算当前节点 root 的左子树的高度以及间接帮助更新最大直径等,并将返回值(左子树的高度)赋给变量 left*/int left = f(root->left);//同样,递归调用f函数来计算当前节点root的右子树的高度,将返回值赋给变量 right。int right = f(root->right);/*更新最大直径的操作,左子树的高度加上右子树的高度,然后通过调用max函数与已记录的全局最大直径Max进行比较,如果当前经过该节点的路径长度更大,就更新Max的值,使其始终保持为到目前为止遍历过程中发现的最大直径*/Max = max(Max,left+right);/*最后,返回以当前节点 root 为根的子树的高度,计算方式是取左子树高度left和右子树高度right中的较大值,再加上1*/return max(left,right)+1;}
};

每日问题

C++中的异常处理机制是怎样的?

1.异常处理的基本概念

在C++程序运行过程中,可能会出现各种错误情况,例如内存分配失败、文件打开失败、除数为零等。异常处理机制提供了一种结构化的方式来处理这些错误,使得程序能够在出现异常情况时,以一种可控的方式进行相应,而不是直接崩溃。

2.异常处理的基本语法

try - catch块

C++使用try-catch块来捕获和处理异常。try块中放置可能会抛出异常的代码。例如:

try{int a = 10;int b = 0;if(b == 0){throw "除数不能为零";                    }int result = a / b;     
}
catch(const char* errorMessage){cerr <<"捕获到异常:"<< errorMessage << endl;
}

在这个例子中,try块中的代码尝试进行除法运算。如果除数b为零,就会抛出一个类型为const char*的异常,异常信息是"除数不能为零"。catch块用于捕获并处理这个异常,在catch块中可以输出错误信息或者进行其他恢复操作。

多个catch块

可以又多个catch块来处理不同类型的异常去。例如:

try{//代码可能会抛出不同类型的常量throw runtime_error("运行时错误");
}
catch(const char* errorMessage){//处理const char* 类型的常量cerr << "捕获到字符指针类型的异常:" << errorMessage <<endl;  
}
catch(runtime_error& error){//处理runtime_error类型的异常cerr << "捕获到运行时错误:" << error.what() <<endl;
}

在这里,try块抛出了一个runtime_error类型的异常。程序会按照catch块的顺序检查,找到匹配的catch块来处理异常。在这个例子中,runtime_error类型的异常会被第二个catch块捕获,因为它的类型更匹配。

3.异常的抛出(throw)

可以在程序中使用throw关键字来抛出异常。throw后面可以跟任何类型的数据,如基本类型、指针、对象等。

例如,函数可以通过抛出异常来通知调用者出现了错误。假设我们有一个函数用于打开文件:

void openFile(const char* fileName){ifstream file(fileName);if(!file){throw runtime_error("无法打开文件");    }//如果文件成功打开,可以进行其他操作
}

当文件无法打开时,函数openFile会抛出一个runtime_error类型的异常,调用者可以在try-catch块中捕获这个异常并处理。

4.异常类层次结构

C++标准库提供了一个异常类层次结构,以exception为基类。这个层次结构包括了许多派生类,如runtime_error、logic_error、bad_allco等。

exception类:

        它是所有标准异常类的基类,提供了一个名为what的虚函数,用于返回异常的描述信息。

runtime_error和logic_error类:

        runtime_error通常用于表示在程序运行时发生的错误,如打开文件失败、网络连接中断等。

        logic_error通常用于表示程序逻辑上的错误,如非法的参数传递等。

bad_allco类:

        用于处理内存分配失败的情况,例如new操作符无法分配足够的内存时会抛出bad_alloc异常。

5.应该使用异常处理的情况

错误处理跨越多个函数调用层次:

        当一个错误可能在函数调用链的深层发生,并且需要将错误信息传递回调用链的上层进行处理时,异常处理是非常合适的。例如,在一个复杂的文件读取系统中,可能有一个函数用于打开文件,另一个函数用于读取文件内容,还有一个函数用于解析文件数据。如果在解析数据阶段发现文件格式错误,使用异常可以方便地将错误信息从解析函数一直传递到最开始调用文件读取流程的函数,而不需要在每个中间函数中都进行复杂的错误码返回和检查。

运行时错误情况:

        对于运行时可能出现的错误,如内存分配失败(new操作符返回nullptr)、除数为零、数组越界访问等情况,异常处理可以提供一种统一的、结构化的方式来处理这些错误。以内存分配为例,当new操作符无法分配足够的内存时会抛出std::bad_alloc异常,通过try - catch块可以捕获这个异常并进行适当的处理,如释放已分配的其他资源或者向用户提示内存不足的信息。

资源管理和清理场景:

        在处理资源(如文件、数据库连接、互斥锁等)时,异常处理可以确保资源在出现异常情况后仍然能够被正确地释放。例如,当打开一个文件后,在读取文件过程中发生异常,使用异常处理机制可以在catch块中确保文件被正确关闭,避免资源泄漏。

6.异常处理的优势和缺点

优势:

提高程序的健壮性:通过合理的异常处理,程序可以在出现错误时进行适当的恢复操作,而不是简单地崩溃,使得程序更加稳定和可靠。

代码结构清晰:将错误处理代码和正常的业务逻辑代码分开,使得程序的逻辑结构更清晰。try-catch块明确地划分了可能出现错误的区域和处理错误的区域。

提供错误传播机制:异常可以沿着函数调用栈向上传播,直到找到合适的catch块来处理它。这对于深层嵌套的函数调用非常有用,不需要在每个中间函数中都编写大量的错误检查代码来返回错误码。例如,在一个由多个子系统组成的大型软件项目中,一个子系统中的底层函数出现异常可以自动传播到上层系统,使得整个软件能够以统一的方式处理错误。

支持自定义异常类型:可以根据程序的具体需求定义自己的异常类型,这些自定义异常可以携带详细的错误信息。例如,在一个银行系统中,可以定义InsufficientBalanceException(余额不足异常)来表示取款操作时余额不够的情况,这个异常可以包含账户余额等相关信息,以便在catch块中更好地处理和向用户展示错误细节。

缺点:

性能开销:会带来一定的性能开销。当抛出异常时,程序需要执行一些额外的操作来查找合适的catch块,这包括栈展开(stack unwinding)过程,即从异常发生的地方开始,沿着函数调用栈向上查找catch块,在这个过程中需要清理局部对象等。在对性能要求极高的场景下,频繁地抛出和捕获异常可能会影响程序的运行效率。例如,在一个实时控制系统中,每微秒的处理时间都很关键,异常处理可能会导致系统响应时间超出可接受范围。

增加代码复杂性:如果过度使用或者不恰当地使用异常处理,可能会使代码变得复杂。例如,过多的try - catch块可能会使程序的控制流难以理解,特别是当异常在多个不同的地方抛出并且被不同的catch块捕获时。而且,需要确保异常的抛出和捕获是合理的,否则可能会出现异常被意外捕获或者没有被正确捕获的情况,导致程序出现难以调试的错误。

资源泄漏风险:虽然异常处理可以帮助管理资源,但如果在catch块中没有正确地释放资源或者处理异常后没有恢复到正确的状态,仍然可能会导致资源泄漏。例如,在一个多线程程序中,如果在捕获异常后没有正确地释放互斥锁,可能会导致其他线程无法获取锁,从而出现死锁或资源竞争等问题。

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

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

相关文章

分享 pdf 转 word 的免费平台

背景 找了很多 pdf 转 word 的平台都骗进去要会员&#xff0c;终于找到一个真正免费的&#xff0c;遂分享。 网址 PDF转Word转换器 - 100%免费市面上最优质的PDF转Word转换器 - 免费且易于使用。无附加水印 - 快速将PDF转成Word。https://smallpdf.com/cn/pdf-to-word

【Java入门 - 分支结构】第2关:if语句测试题

Java 中的 if 语句&#xff1a;灵活控制程序流程的利器 在 Java 编程中&#xff0c;if语句是一种基本但极其重要的控制结构&#xff0c;它允许我们根据特定的条件来决定程序的执行路径。本文将深入探讨 Java 中的if语句&#xff0c;介绍其语法、用法和一些常见的应用场景。 一…

iOS 18.1,未公开的新功能

童锦程祖师爷曾说过&#xff1a;“发誓可以&#xff0c;发朋友圈不行。”表面上看是渣男语录&#xff0c;实际上也说明了人们对隐私的看重。 在当今生活中&#xff0c;智能手机可能是最私密的电子产品&#xff0c;没有之一。不管是照片、联系人、短信、APP数据&#xff0c;甚至…

06.VSCODE:备战大项目,CMake专项配置

娇小灵活的简捷配置不过是年轻人谈情说爱的玩具&#xff0c;帝国大厦的构建&#xff0c;终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目&#xff0c;就像未来世界里的一台相声表演&#xff0c;有了德纲却无谦&#xff0c;观众笑着遗憾。—— 语出《双城记》作者&…

基于 CentOS7.6 的 Docker 下载常用的容器(MySQLRedisMongoDB),解决拉取容器镜像失败问题

安装MySQL&Redis&MongoDB mysql选择是8版本&#xff0c;redis是选择4版本、mongoDB选择最新版&#xff0c;也可以根据自己的需要进行下载对应的版本&#xff0c;无非就是容器名:版本号 这样去拉去相关的容器镜像。如果你还不会在服务器中安装 docker&#xff0c;可以查…

Sping全面复习

Spring框架是一个功能强大且广泛使用的Java平台&#xff0c;它通过提供全面的基础设施支持&#xff0c;使得开发人员能够轻松构建高效、可移植、易于测试的代码。Spring的核心特性包括依赖注入&#xff08;DI&#xff09;、面向切面编程&#xff08;AOP&#xff09;和事件驱动模…

【Linux学习】【Ubuntu入门】1-3 ubuntu连接USB设备

1.打开VMware&#xff0c;打开新建的虚拟机&#xff0c;插入U盘&#xff0c;可在弹出对话框进行选择USB连接到主机或连接到虚拟机。&#xff08;长时间未操作默认连接主机&#xff09; 2.若USB在连接主机的情况下&#xff0c;可通过右键点击右下角进行连接到虚拟机。 3.若已连接…

炼码LintCode--数据库--基础语法--刷题笔记_01

目录 炼码LintCode数据库入门级别的笔记未完待续~~~ 炼码LintCode 数据库 入门级别的笔记 笔记如下&#xff0c;把所有涉及到的入门级别的知识点简单总结了一下。 以及一点点举一反三的写法。 增 INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);批量增 INSERT INT…

docker:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled

无数次的拉镜像让人崩溃&#xff1a; rootnode11:~/ragflow/docker# more rag.sh #export HTTP_PROXYhttp://192.168.207.127:7890 #export HTTPS_PROXYhttp://192.168.207.127:7890 #export NO_PROXYlocalhost,127.0.0.1,.aliyun.com docker compose -f docker-compose-gpu-C…

Flutter:使用Future发送网络请求

pubspec.yaml配置http的SDK cupertino_icons: ^1.0.8 http: ^1.2.2请求数据的格式转换 // Map 转 json final chat {name: 张三,message: 吃饭了吗, }; final chatJson json.encode(chat); print(chatJson);// json转Map final newChat json.decode(chatJson); print(newCha…

llama-cpp模型轻量化部署与量化

一、定义 定义配置环境遇到的问题&#xff0c;交互模式下模型一直输出&#xff0c;不会停止模型量化Qwen1.5-7B 案例demo 二、实现 定义 主要应用与cpu 上的部署框架。由c完成。配置环境 https://github.com/ggerganov/llama.cpp https://github.com/echonoshy/cgft-llm/blo…

阅读《当代反无人机系统技术综述》笔记

目录 文献基本信息 序言 一、关键技术 1.1射频(RF)分析仪 1.2雷达 1.3视觉传感器和图像处理 1.4声学传感器 二、发展趋势 文献基本信息 题名&#xff1a;当代反无人机系统技术综述 作者&#xff1a;蒋罗婷 来源&#xff1a;电子质量 发表时间&#xff1a;2023-02-2…

【Lucene】倒排表和词典:提升搜索效率的关键数据结构

倒排表和词典&#xff1a;提升搜索效率的关键数据结构 倒排表&#xff08;Inverted Index&#xff09;和词典&#xff08;Term Dictionary&#xff09;是 Lucene 中用于加速搜索的关键数据结构&#xff0c;它们帮助系统在庞大的文档集合中快速定位包含特定关键词的文档。以下是…

RN开发遇到的坑

1 、 RN 启动崩溃 https://blog.csdn.net/qq_31915745/article/details/108125671 2、修改报红⻚ https://blog.csdn.net/weixin_43969056/article/details/104757926 3 、编译不过去提示 glog-0.3.5 有问题&#xff0c; 找到 / 项⽬ /node_modules/react-native/scripts/ io…

基于Multisim信号波形发生器电路正弦波方波三角波锯齿波(含仿真和报告)

【全套资料.zip】正弦方波三角波锯齿波方波占空比可调频率可调电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.设计一个能够产生多个信号输出的信号发生器&#xff0c; 要求输出波形…

GC9A01驱动移植(HALL库)

最近在做LVGL的移植&#xff0c;用到的屏幕驱动时GC9A01的&#xff0c;记录一下学习历程&#xff0c;防止日后遗忘。 这款屏幕我使用的是SPI协议&#xff0c;参考了部分稚辉菌大佬这个项目的程序&#xff1a; 【自制】我做了个能动的迷你电脑配件&#xff01;【软核】_哔哩哔…

PCIe板卡标准尺寸

一、板卡尺寸说明 两种PCIe外接卡的高度&#xff0c;即全高&#xff08;Standard height&#xff09;111.15 mm (4.376 inches)和半高&#xff08;half height&#xff09;68.90 mm (2.731 inches)&#xff1b; 两种PCIe外接卡的长度&#xff1a;全长&#xff08;full length&a…

docker 阿里云镜像加速

在阿里云首页点击产品-容器-容器镜像服务ACR 无需购买&#xff0c;直接进去控制台创建个人版 完成后点击镜像加速器 选择对应的系统&#xff0c;按照操作文档完成

KPaaS洞察|异构系统中用户角色与权限分类及管理解决方案

多个异构系统的使用已经成为企业常态。每个系统通常有自己独立的用户角色和权限设置&#xff0c;导致权限管理复杂且容易出现冲突。如何在多个异构系统中统一、有效地进行用户角色和权限管理&#xff0c;已成为企业保障数据安全和提升管理效率的关键挑战。通过集中式权限管理平…

食品配送管理系统(源码+文档+部署+讲解)

食品配送管理系统是成品商业化项目&#xff0c;系统可基于源码二开。 系统概述 餐饮食品配送&#xff0c;包含配送人APP、下单APP、管理端等&#xff0c;实现订餐、配餐&#xff0c;用于食品店、中央厨房等订餐、团餐业务 本项目名称为食品配送系统&#xff0c;是针对食品配…