练习题(2024/5/3)

1对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

递归思路:

  1. 定义递归的函数功能:
    • 比较左右子树是否对称
  2. 确定递归的结束条件:
    • 当左节点和右节点都为空时,说明对称,返回true
    • 当左节点和右节点其中一个为空时,说明不对称,返回false
    • 当左节点和右节点的数值不相等时,说明不对称,返回false
  3. 确定递归的返回值:
    • 返回左子树的左节点和右子树的右节点是否对称,以及左子树的右节点和右子树的左节点是否对称,两者都对称则返回true,否则返回false
  4. 在主函数中调用递归函数,判断整棵树是否对称。如果根节点为空,直接返回true;否则调用递归函数进行判断。

代码:

class Solution {
public:
    // 递归函数,用于比较左右子树是否对称
    bool compare(TreeNode* left, TreeNode* right) {
        // 首先排除空节点的情况
        if (left == NULL && right != NULL) return false;
        else if (left != NULL && right == NULL) return false;
        else if (left == NULL && right == NULL) return true;
        // 排除了空节点,再排除数值不相同的情况
        else if (left->val != right->val) return false;

        // 此时左右节点都不为空,且数值相同的情况,继续递归判断子树
        bool outside = compare(left->left, right->right);   // 左子树的左节点和右子树的右节点比较
        bool inside = compare(left->right, right->left);    // 左子树的右节点和右子树的左节点比较
        bool isSame = outside && inside;                    // 判断是否对称
        return isSame;                                      // 返回结果
    }

    // 主函数,判断整棵树是否对称
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;      // 空树也算对称
        return compare(root->left, root->right);  // 调用递归函数比较左右子树
    }
};

2完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例 1:

输入:root = [1,2,3,4,5,6]
输出:6

示例 2:

输入:root = []
输出:0

示例 3:

输入:root = [1]
输出:1

提示:

  • 树中节点的数目范围是[0, 5 * 104]
  • 0 <= Node.val <= 5 * 104
  • 题目数据保证输入的树是 完全二叉树

思路:

通过递归的方式计算一棵树的节点数。在递归函数中,先判断当前节点是否为空,若为空则节点数为0;然后递归计算左右子树的节点数,并将左右子树节点数之和加上当前节点即为当前子树的节点数。主函数调用递归函数计算整棵树的节点数,并返回结果。

代码:

class Solution {
private:
    // 递归函数,用于获取以当前节点为根的子树的节点数
    int getNodesNum(TreeNode* cur) {
        // 当前节点为空,节点数为0
        if (cur == nullptr) return 0;
        
        // 递归获取左子树节点数
        int leftNum = getNodesNum(cur->left);      // 左
        // 递归获取右子树节点数
        int rightNum = getNodesNum(cur->right);    // 右
        // 当前节点的节点数为左右子树节点数之和加上当前节点
        int treeNum = leftNum + rightNum + 1;      // 中
        
        return treeNum;
    }
public:
    // 主函数,计算整棵树的节点数
    int countNodes(TreeNode* root) {
        // 调用递归函数获取整棵树的节点数
        return getNodesNum(root);
    }
};

2迭代思路:

使用了队列来按层遍历整棵树,并统计节点的数量。首先将根节点压入队列,然后进入循环,每次循环先获取当前层节点的数量,然后对当前层节点进行遍历,依次取出节点,统计节点数量,并将节点的左右子节点(如果存在)压入队列。最终返回统计的节点数量。

代码:

class Solution{
    public:
      int countNodes(TreeNode* root){
        queue<TreeNode* > que; // 定义一个队列用于存储节点
        if(root !=nullptr)  que.push(root); // 将根节点压入队列
        int result =0; // 记录节点数量
        while(!que.empty()){ // 循环直到队列为空
            int size=que.size(); // 获取当前队列大小,即当前层节点数量
            for(int i=0;i<size;i++){ // 对当前层节点进行遍历
                TreeNode* node=que.front(); // 取出队首节点
                que.pop(); // 弹出队首节点
                result++;   // 记录节点数量
                if (node->left) que.push(node->left); // 左子树不为空则压入队列
                if (node->right) que.push(node->right); // 右子树不为空则压入队列
            }
        }
        return result; // 返回节点数量
      }
};

3平衡二叉树

给定一个二叉树,判断它是否是 

平衡二叉树

平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。

  

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

思路:

通过递归的方式来判断一个二叉树是否是平衡二叉树。其中getHeight函数用来计算以当前节点为根节点的二叉树的高度,如果不是平衡二叉树则返回-1。在计算当前节点的高度时,先递归计算左子树和右子树的高度,如果左子树或右子树不是平衡二叉树(高度为-1),则直接返回-1。然后再判断左右子树的高度差是否大于1,如果是则返回-1,否则返回当前节点为根节点的二叉树的高度。最后在isBalanced函数中判断整棵树的高度是否为-1,如果是则返回false,否则返回true

代码:

class Solution {
public:
    // 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树则返回-1
    int getHeight(TreeNode* node) {
        if (node == NULL) {
            return 0; // 如果节点为空,返回高度0
        }
        int leftHeight = getHeight(node->left); // 获取左子树的高度
        if (leftHeight == -1) {
            return -1; // 如果左子树不是平衡二叉树,直接返回-1
        }
        int rightHeight = getHeight(node->right); // 获取右子树的高度
        if (rightHeight == -1) {
            return -1; // 如果右子树不是平衡二叉树,直接返回-1
        }
        if (abs(leftHeight - rightHeight) > 1) { // 如果左右子树高度差大于1,则不是平衡二叉树
            return -1;
        } else {
            return 1 + max(leftHeight, rightHeight); // 返回当前节点为根节点的二叉树的高度
        }
    }
    bool isBalanced(TreeNode* root) {
        int height = getHeight(root); // 获取二叉树的高度
        if (height == -1) {
            return false; // 如果高度为-1,则不是平衡二叉树
        } else {
            return true; // 否则是平衡二叉树
        }
    }
};

4使用唯一标识码替换员工ID

Employees 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| name          | varchar |
+---------------+---------+
在 SQL 中,id 是这张表的主键。
这张表的每一行分别代表了某公司其中一位员工的名字和 ID 。

EmployeeUNI 表:

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| unique_id     | int     |
+---------------+---------+
在 SQL 中,(id, unique_id) 是这张表的主键。
这张表的每一行包含了该公司某位员工的 ID 和他的唯一标识码(unique ID)。

展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。

你可以以 任意 顺序返回结果表。

返回结果的格式如下例所示。

示例 1:

输入:
Employees 表:
+----+----------+
| id | name     |
+----+----------+
| 1  | Alice    |
| 7  | Bob      |
| 11 | Meir     |
| 90 | Winston  |
| 3  | Jonathan |
+----+----------+
EmployeeUNI 表:
+----+-----------+
| id | unique_id |
+----+-----------+
| 3  | 1         |
| 11 | 2         |
| 90 | 3         |
+----+-----------+
输出:
+-----------+----------+
| unique_id | name     |
+-----------+----------+
| null      | Alice    |
| null      | Bob      |
| 2         | Meir     |
| 3         | Winston  |
| 1         | Jonathan |
+-----------+----------+
解释:
Alice and Bob 没有唯一标识码, 因此我们使用 null 替代。
Meir 的唯一标识码是 2 。
Winston 的唯一标识码是 3 。
Jonathan 唯一标识码是 1 。

思路:

通过左连接(left join)将两个表Employees和EmployeeUNI进行关联查询,关联条件是Employees表中的id字段与EmployeeUNI表中的id字段相等。查询结果包括了EmployeeUNI表中的unique_id字段和Employees表中的name字段,以展示每位员工的唯一身份ID和姓名。

代码:

select
    EmployeeUNI.unique_id, Employees.name
from 
    Employees
left join
    EmployeeUNI
on
    Employees.id = EmployeeUNI.id

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端工程化04-VsCode插件设置总结(持续更)

1、输出语句log设置 log输出、平常你输出log,还必须得打一个console然后再.log()非常不方便&#xff0c;当然我们可以直接输入一个log,但是提示有两个&#xff0c;我们还得上下选择 所以我们直接采用插件的提示 一个clg就可以了 2、括号包裹提示 找到VsCode的settings.js文…

考研入门55问---基础知识篇

考研入门55问---基础知识篇 01 &#xff1e;什么是研究生入学考试&#xff1f; 研究生是指大专和本科之后的深造课程。以研究生为最高学历, 研究生毕业后&#xff0c;也可称研究生&#xff0c;含义为研究生学历的人。在中国大陆地区&#xff0c;普通民众一般也将硕士毕业生称…

微图乐 多种装B截图一键制作工具(仅供娱乐交流)

软件介绍 采用exe进程交互通信。全新UI界面&#xff0c;让界面更加清爽简约。支持zfb、VX、TX、Yin行、Dai款、游戏等图片生成&#xff0c;一键超清原图复制到剪辑板&#xff0c;分享给好友。适用于提高商家信誉度&#xff0c;产品销售额度。装逼娱乐&#xff0c;用微图乐。图…

InfiniFlow 創始人兼CEO張穎峰確認出席“邊緣智能2024 - AI開發者峰會”

隨著AI技術的迅猛發展&#xff0c;全球正逐步進入邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同書寫著分布式智能創新應用的壯麗篇章。邊緣智能&#xff0c;作為融合邊緣計算和智能技術的新興領域&#xff0c;正逐漸成為推動AI發展的關鍵力量。借助分布式和去中心…

扫雷实现详解【递归展开+首次必展开+标记雷+取消标记雷】

扫雷 一.扫雷设计思路二.扫雷代码逐步实现1.创建游戏菜单2.初始化棋盘3.打印棋盘4.随机布置雷5.统计周围雷的个数6.递归展开棋盘7.标记雷8.删除雷的标记9.保证第一次排雷的安全性棋盘必定展开10.排查雷11.判断输赢 三.扫雷总代码四.截图 一.扫雷设计思路 1.创建游戏菜单。  2.…

使用机器学习确定文本的编程语言

导入必要的库 norman Python 语句&#xff1a;import <span style"color:#000000"><span style"background-color:#fbedbb"><span style"color:#0000ff">import</span> pandas <span style"color:#0000ff&quo…

Postman的一些使用技巧

Postman 是一个流行的 API 开发工具&#xff0c;用于设计、开发、测试、发布和监控 API。在现代web开发中使用非常广泛。后端开发必备而且必会的工具。 目录 1.配置环境变量 2.动态变量 3.脚本 4.测试 5.模拟 6.监控 7.集合运行器 8.响应保存 9.请求历史 10.同步请求…

基于springboot+vue+Mysql的影城管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

brpc profiler

cpu profiler cpu profiler | bRPC MacOS的额外配置 在MacOS下&#xff0c;gperftools中的perl pprof脚本无法将函数地址转变成函数名&#xff0c;解决办法是&#xff1a; 安装standalone pprof&#xff0c;并把下载的pprof二进制文件路径写入环境变量GOOGLE_PPROF_BINARY_PA…

现代循环神经网络(GRU、LSTM)(Pytorch 14)

一 简介 前一章中我们介绍了循环神经网络的基础知识&#xff0c;这种网络 可以更好地处理序列数据。我们在文本数据上实现 了基于循环神经网络的语言模型&#xff0c;但是对于当今各种各样的序列学习问题&#xff0c;这些技术可能并不够用。 例如&#xff0c;循环神经网络在…

Java中接口的默认方法

为什么要使用默认方法 当我们把一个程序的接口写完后 用其他的类去实现&#xff0c;此时如果程序需要再添加一个抽象方法的时候我们只有两种选择 将抽象方法写在原本的接口中 但是这样写会导致其他所有改接口的实现类都需要实现这个抽象方法比较麻烦 写另一个接口 让需要的实…

23.哀家要长脑子了!

目录 1.290. 单词规律 - 力扣&#xff08;LeetCode&#xff09; 2.532. 数组中的 k-diff 数对 - 力扣&#xff08;LeetCode&#xff09; 3.205. 同构字符串 - 力扣&#xff08;LeetCode&#xff09; 4.138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 5.599. 两…

Spring Boot与OpenCV:融合机器学习的智能图像与视频处理平台

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

VMware虚拟机中ubuntu使用记录(6)—— 如何标定单目相机的内参(张正友标定法)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、张正友相机标定法1. 工具的准备2. 标定的步骤(1) 启动相机(2) 启动标定程序(3) 标定过程的操作(5)可能的报错 3. 标定文件内容解析 前言 张正友相机标定法…

什么是PWM?

1.PWM也叫做脉冲宽度调制&#xff0c;它是一种模拟控制方式&#xff0c;根据相应 载荷 的变化来调制晶体管基级和MOS管栅极的偏置&#xff0c;来实现 晶体管 或 MOS管 导通时间的改变&#xff0c;从而实现开关稳压电源输出的改变。 这种方式能使电源的输出电压在工作条件变化时…

linux的基础入门(2)

环境变量 在Shell中&#xff0c;正确的赋值语法是没有空格的&#xff0c;即变量名数值。所以&#xff0c;正确的方式是&#xff1a; tmpshy 这样就将变量tmp赋值为"shy"了。 注意&#xff1a;并不是任何形式的变量名都是可用的&#xff0c;变量名只能是英文字母、…

Reac19 升级指南

Reactv19 已经发布 beta 版本&#xff0c;想要快速体验如何升级到 v19 版本尝鲜的朋友们可以查阅进行了解 前言 React 已于近日发布了 v19 的 beta 版本&#xff0c;同时为了帮助后续的 v19 升级&#xff0c;也同时发布了 v18.3.0的正式版&#xff0c; 与 v18.2 版本完全相同…

JavaEE初阶Day 15:文件IO(1)

目录 Day 15&#xff1a;文件IO&#xff08;1&#xff09;IO文件1. 路径2. 文件的分类3. 使用Java针对文件系统进行操作3.1 属性3.2 构造方法3.3 方法 Day 15&#xff1a;文件IO&#xff08;1&#xff09; IO I&#xff1a;Input输入 O&#xff1a;Output输出 输入输出规则…

【golang-ent】go-zero框架 整合 ent orm框架实现一对一 一对多 多种姿势查询方式

一、ent的 O2O 问题 官方文档如下: https://entgo.io/zh/docs/schema-edges#o2o-same-type 1、ent O2O问题 官方提供了三种 one2one的方式,可以看到他全部使用了 mysql的 foregionKey 的方式进行关联,虽然举例了单表和双表的不同使用方式,但是我们实际使用mysql中是不创建…

深度解析 Spring 源码:探寻Bean的生命周期

文章目录 一、 Bean生命周期概述二、Bean生命周期流程图三、Bean生命周期验证3.1 代码案例3.2 执行结果 四、Bean生命周期源码4.1 setBeanName()4.2 setBeanFactory()4.3 setApplicationContext()4.4 postProcessBeforeInitialization()4.5 afterPropertiesSet()4.6 postProces…