当前位置: 首页 > article >正文

力扣 平衡二叉树-110

平衡二叉树-110

class Solution {
public:
    /*如果 height 函数返回的值大于等于 0,说明整个二叉树是平衡的
    (因为在height函数中,只有当发现不平衡的情况时才会返回 -1),
    此时函数返回 true;否则返回 false*/
    bool isBalanced(TreeNode* root) {
        return height(root) >= 0;
    }
    int height(TreeNode* root) {
    /*函数接受一个指向二叉树节点的指针root,如果root为NULL,表示当前节点为空,
    按照二叉树高度的定义,空节点的高度为 0,所以直接返回 0*/
        if (root == NULL) {
            return 0;
        }
    //通过递归调用height函数分别计算当前节点root的左子树高度left和右子树高度right。
        int left = height(root->left);
        int right = height(root->right);
    /*在得到左右子树高度后,进行判断,如果左子树高度为 -1,或者右子树高度为 -1,
    并通过abs函数计算左右子树高度差的绝对值,如果这个绝对值大于 1
    这说明着在递归计算子树高度的过程中已经发现了子树不平衡的情况,直接返回 -1*/
        if (left == -1 || right == -1 || abs(left - right) > 1) {
            return -1;
        } else {
    /*如果以上不平衡的条件都不满足,说明当前节点及其子树是平衡的,
    此时返回左右子树中较高的高度加 1,作为当前节点所在子树的高度*/
            return max(left, right) + 1;
        }
    }
};

每日问题

什么是C++命名空间,有什么作用?

1.定义

在C++中,命名空间(namespace)是一种用于将代码中的标识符(如变量、函数、类等)分组并避免命名冲突的机制。它提供了一个逻辑上的范围,它提供了一个逻辑上的范围,使得再不同命名空间中的相同名称可以独立存在。

例如,有两个不同的库都定义了一个名为 print 的函数。如果没有命名空间,当同时使用这两个库时,编译器会不知道该使用哪个 print 函数,从而产生命名冲突。而命名空间可以将这些同名的标识符分隔开。

2.作用

避免命名冲突:

这是命名空间最主要的作用。当开发大型项目时,可能会有多个开发人员编写代码,或者使用多个第三方库。不同的部分可能会定义相同名称的变量、函数或类。例如例如,一个游戏开发团队可能有一个名为 Physics 的模块用于处理物理计算,其中有一个函数 calculateForce;同时,一个图形渲染模块也可能有一个同名的函数 calculateForce,用于计算与图形渲染相关的力。通过将它们放在不同的命名空间中,如 namespace Physics 和 namespace Graphics,可以避免命名冲突。

代码的组织和模块化:

命名空间有助于将相关的代码组织在一起。例如,在一个数学库中,可以将所有与几何计算相关的代码放在一个命名空间(如 namespace Geometry)中,将所有与代数计算相关的代码放在另一个命名空间(如 namespace Algebra)中。这样,代码的结构更加清晰,便于阅读和维护。

控制标识符的可见性:

可以通过命名空间来控制标识符的访问范围。例如,一个命名空间中的某些函数或变量可能是供内部使用的,不希望被外部代码直接访问。可以将这些标识符定义在一个特定的命名空间中,并限制其访问权限,从而提高代码的封装性。

3.使用示例

定义命名空间:

可以使用namespace关键字来定义命名空间。例如:

namespace MyNamespace{
    int myVariable;
    void myFunction(){
        //函数体    
    }
    class MyClass{
        //类的定义                
    };
}

在这个例子中,myVariable和myFunction和MyClass都属于MyNamespace命名空间。

命名空间的分文件定义:

命名空间的定义可以分布在多个文件中。例如,在一个头文件my_namespace_header.h中可以这样定义:

#ifndef MY_NAMESPACE_HEADER_H
#define MY_NAMESPACE_HEADER_H
namespace MyNamespace {
    void function_declaration();
}
#endif

然后在对应的源文件my_namespace_source.cpp中实现函数

#include "my_namespace_header.h"
namespace MyNamespace {
    void function_declaration() {
        // 函数实现
    }
}

访问命名空间中的成员:

有多种方式来访问命名空间种的成员。

使用作用域解析运算符(::):

例如,如果要在命名空间外部访问myFunction,可以这样写:

MyNamespace::myFunction();

使用using关键字:

using关键字可以将命名空间中的成员引入到当前作用域,使得在访问这些成员时不需要再使用作用域解析运算符。例如:

using MyNamespace::myFunction;
myFunction();

不过这种方式要谨慎使用,因为如果有多个命名空间中有同名的成员,可能会再次引入命名冲突。

还可以使用using namespace来引入整个命名空间,如using namespace MyNamespace;,但这种方式可能会导致更多的潜在命名冲突,一般不推荐在头文件中使用。

交代命名空间是否允许嵌套?

命名空间是允许嵌套的。例如:

可以定义一个嵌套的命名空间:

namespace OuterNamespace {
    int outerVariable = 100;
    namespace InnerNamespace {
        int innerVariable = 200;
        void innerFunction() {
            // 函数体
        }
    }
}

要访问嵌套命名空间中的成员,可以使用多级作用域解析运算符。例如,要访问innerVariable和innerFunction,可以这样写:

int main() {
    OuterNamespace::InnerNamespace::innerVariable = 300;
    OuterNamespace::InnerNamespace::innerFunction();
    return 0;
}

也可以使用using声明或using namespace来简化对嵌套命名空间成员的访问,但同样要注意可能带来的命名冲突问题。例如,使用using声明:

using OuterNamespace::InnerNamespace::innerFunction;
int main() {
    innerFunction();
    return 0;
}


http://www.kler.cn/a/395372.html

相关文章:

  • linux,一、部署LNMP环境二、配置动静分离三、地址重写四、编写systemd Unit文件
  • SSE与WebSocket与MQTT
  • 【代码审计】常见漏洞专项审计-业务逻辑漏洞审计
  • js中typeOf无法区分数组对象
  • 深度学习之pytorch常见的学习率绘制
  • Vulnhub靶场案例渗透[8]- HackableII
  • 【论文阅读】HITS: High-coverage LLM-based Unit Test Generation via Method Slicing
  • 【计算机视觉】FusionGAN
  • 【MySQL】数据库表连接简明解释
  • 【代码审计】常见漏洞专项审计-业务逻辑漏洞审计
  • TypeScript:现代 JavaScript 的超级集
  • rockylinux 8安装 gcc11.2
  • 用两行命令快速搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),包含完整的 Docker 安装步骤
  • 爬虫开发工具与环境搭建——环境配置
  • 火山引擎数据飞轮模式下的线上营销:内容产出更智能、人群触达更精准
  • Linux系统常用操作与命令指南
  • Apache服务安装
  • 单网页图库应用Single File PHP Gallery
  • 求知导刊期刊简介及投稿点评
  • 【go从零单排】URL Parsing(URL解析)
  • PyEcharts | 通过分析奥迪车购买数据来学习柱状折线复合图像的绘制方法
  • 风险数据集市整体架构及技术实现
  • 深度学习知识点1--编码器与解码器
  • 怎样在软件设计中选择使用GOF设计模式
  • 前端笔试中oj算法题的解法模版
  • Git - 命令杂谈 - fetch与push