练习题(2024/5/4)

news2024/12/24 10:27:36

1 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

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

提示:

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

思路:

通过递归遍历二叉树的方式来实现。

第一步是确定递归函数的参数和返回值。在这里,递归函数的参数包括当前节点cur、当前路径path以及存储结果的容器result,返回值为void类型。

第二步是确定递归函数的结束条件。在这里,当当前节点为叶子节点时,即左右子节点都为空时,将当前路径添加到结果集中并返回。

第三步是确定递归函数的单层递归逻辑。在这里,我们首先将当前节点的值添加到路径中,然后分别向左子树和右子树递归遍历。当向左子树遍历时,将当前路径加上“->”作为路径传入递归函数中;同样,当向右子树遍历时,也是将当前路径加上“->”作为路径传入递归函数中。

最后,在主函数中通过调用递归函数,从根节点开始递归遍历二叉树,将所有根节点到叶子节点的路径添加到结果集中并返回结果。

代码:

class Solution {
private:
    // 递归遍历二叉树
    void traversal(TreeNode* cur, string path, vector<string>& result) {
        // 将当前节点的值添加到路径中
        path += to_string(cur->val);
        // 如果当前节点是叶子节点,将路径添加到结果集中并返回
        if (cur->left == nullptr && cur->right == nullptr) {
            result.push_back(path);
            return;
        }
        // 向左子树遍历
        if (cur->left) {
            string leftPath = path + "->";
            traversal(cur->left, leftPath, result); // 左
        }
        // 向右子树遍历
        if (cur->right) {
            string rightPath = path + "->";
            traversal(cur->right, rightPath, result); // 右
        }
    }
public:
    // 获取二叉树所有根节点到叶子节点的路径
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        if (root == nullptr) {
            return result;
        }
        string path; // 初始化路径为空
        traversal(root, path, result); // 从根节点开始递归遍历
        return result;
    }
};

2相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

输入:p = [1,2,1], q = [1,1,2]
输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100] 内
  • -104 <= Node.val <= 104

思路:

使用递归来判断两棵树是否相同。首先判断特殊情况,如果两个节点都为空,则返回true;如果一个节点为空另一个节点不为空,则返回false;如果两个节点的值不相同,则返回false。然后递归判断两个节点的左子树和右子树是否相同,最终返回判断结果。

代码:

class Solution {
public:
    // 判断两棵树是否相同
    bool isSameTree(TreeNode* p, TreeNode* q) {
        // 如果两个节点均为空,则相同
        if (p == nullptr && q == nullptr) {
            return true;
        }
        // 如果一个节点为空,另一个不为空,则不相同
        else if (p == nullptr || q == nullptr) {
            return false;
        }
        // 如果节点值不相同,则不相同
        else if (p->val != q->val) {
            return false;
        }
        // 递归判断左右子树是否相同
        else {
            return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
        }
    }
};

3另一棵树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

示例 1:

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

示例 2:

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

提示:

  • root 树上的节点数量范围是 [1, 2000]
  • subRoot 树上的节点数量范围是 [1, 1000]
  • -104 <= root.val <= 104
  • -104 <= subRoot.val <= 104

思路:

使用isSameTree函数来判断两棵树是否相同,这个函数要判断两棵树是否有相同的结构和节点值。然后在isSubtree函数中,我们逐个检查给定树的所有节点,看是否存在与给定子树相同的子树。如果当前节点与给定子树相同,则直接返回true;否则递归检查左子树和右子树,直到找到相同的子树或遍历完整个树。整个过程就是利用递归的方式不断向下查找相同的子树,利用isSameTree函数来确定子树是否相同。

代码:

class Solution {
public:
    // 判断两棵树是否相同
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if (p == nullptr && q == nullptr) // 如果两个节点均为空,则相同
            return true;
        if (p == nullptr || q == nullptr) // 如果一个节点为空另一个节点不为空,则不相同
            return false;
        if (p->val != q->val) // 如果两个节点的值不相同,则不相同
            return false;
        // 递归判断左右子树是否相同
        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    }
    // 判断是否为子树
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
        if (root == nullptr) // 如果根节点为空,无法比较子树
            return false;
        bool flag = isSameTree(root, subRoot); // 判断当前节点与子树是否相同
        if (flag) // 如果相同,则直接返回true
            return true;
        // 否则递归检查左子树和右子树
        return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
    }
};

4排名靠前的旅行者

表:Users

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| name          | varchar |
+---------------+---------+
id 是该表中具有唯一值的列。
name 是用户名字。

表:Rides

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| user_id       | int     |
| distance      | int     |
+---------------+---------+
id 是该表中具有唯一值的列。
user_id 是本次行程的用户的 id, 而该用户此次行程距离为 distance 。

编写解决方案,报告每个用户的旅行距离。

返回的结果表单,以 travelled_distance 降序排列 ,如果有两个或者更多的用户旅行了相同的距离, 那么再以 name 升序排列 。

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

示例 1:

输入:
Users 表:
+------+-----------+
| id   | name      |
+------+-----------+
| 1    | Alice     |
| 2    | Bob       |
| 3    | Alex      |
| 4    | Donald    |
| 7    | Lee       |
| 13   | Jonathan  |
| 19   | Elvis     |
+------+-----------+

Rides 表:
+------+----------+----------+
| id   | user_id  | distance |
+------+----------+----------+
| 1    | 1        | 120      |
| 2    | 2        | 317      |
| 3    | 3        | 222      |
| 4    | 7        | 100      |
| 5    | 13       | 312      |
| 6    | 19       | 50       |
| 7    | 7        | 120      |
| 8    | 19       | 400      |
| 9    | 7        | 230      |
+------+----------+----------+
输出:
+----------+--------------------+
| name     | travelled_distance |
+----------+--------------------+
| Elvis    | 450                |
| Lee      | 450                |
| Bob      | 317                |
| Jonathan | 312                |
| Alex     | 222                |
| Alice    | 120                |
| Donald   | 0                  |
+----------+--------------------+
解释:
Elvis 和 Lee 旅行了 450 英里,Elvis 是排名靠前的旅行者,因为他的名字在字母表上的排序比 Lee 更小。
Bob, Jonathan, Alex 和 Alice 只有一次行程,我们只按此次行程的全部距离对他们排序。
Donald 没有任何行程, 他的旅行距离为 0。

思路:

从用户表和骑行记录表进行左连接,根据用户ID进行连接,并按用户ID分组。然后计算每个用户的行驶距离,如果没有行驶记录则将距离设置为0。最后按行驶距离降序排序,并按用户名升序排序,从而得到每位用户的行驶距离情况。

在 SQL 中,IFNULL 是一个函数,用于处理 NULL 值。IFNULL 函数接受两个参数,如果第一个参数不为 NULL,则返回第一个参数的值;如果第一个参数为 NULL,则返回第二个参数的值

代码:

select name,ifnull(sum(distance),0) travelled_distance  
from users left join rides 
on users.id = rides.user_id 
group by user_id 
order by sum(distance) desc,name

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

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

相关文章

学习Rust的第26天:Rust中的cp

在本文中复刻了 cp 实用程序的功能&#xff0c;我想默认使其递归&#xff0c;因为每次我想复制时都输入 -R 文件夹都会觉得有点重复&#xff0c;本文代码将与前文代码保持相似&#xff0c;我们只会更改程序的核心功能和一些变量名称以匹配用例 Pseudo Code 伪代码 function cop…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程&#xff0c;这里略过。 3. 安装 ninja …

C++:继承-继承权限

在C中&#xff0c;类的权限分为公有、私有和保护三种。这些权限控制了类的成员&#xff08;数据成员和成员函数&#xff09;对外部代码的可见性和访问性。 公有&#xff08;public&#xff09;权限&#xff1a; 在公有权限下声明的成员可以被类的外部代码直接访问&#xff1b;公…

小程序引入 Vant Weapp 极简教程

一切以 Vant Weapp 官方文档 为准 Vant Weapp 官方文档 - 快速入手 1. 安装nodejs 前往官网下载安装即可 nodejs官网 安装好后 在命令行&#xff08;winr&#xff0c;输入cmd&#xff09;输入 node -v若显示版本信息&#xff0c;即为安装成功 2. 在 小程序根目录 命令行/终端…

langchain+qwen1.5-7b-chat搭建本地RAG系统

已开源&#xff1a;https://github.com/stay-leave/enhance_llm 概念 检索增强生成&#xff08;Retrieval Augmented Generation, RAG&#xff09;是一种结合语言模型和信息检索的技术&#xff0c;用于生成更准确且与上下文相关的输出。 通用模型遇到的问题&#xff0c;也是…

头歌实践教学平台:三维图形观察OpenGL1.0

一.任务描述 根据提示&#xff0c;在右侧修改代码&#xff0c;并自己绘制出图形。平台会对你编写的代码进行测试。 1.本关任务 学习了解三维图形几何变换原理。 理解掌握OpenGL三维图形几何变换的方法。 理解掌握OpenGL程序的模型视图变换。 掌握OpenGL三维图形显示与观察的…

怎么用CAPL与Python交互

怎么用CAPL与其他应用程序交互 怎么用CAPL与Python交互 怎么用CAPL与Python交互 怎么用CAPL与其他应用程序交互前言1、CAPL怎么调Python&#xff1f;1.1CAPL调Python的命令1.2CAPL调用Python实例 2、怎么把python运行的结果返回给CAPL2.1通过环境变量 3、CAPL调Python的输入参…

OCC笔记:选择TopoDS_Shape顶点、边、面等等

1、通过AIS_InteractiveContext的函数访问当前选择的图形 hAISContext->InitSelected(); hAISContext->MoreSelected(); hAISContext->NextSelected()&#xff1b; hAISContext->SelectedShape()&#xff1b; 其中hAISContext->SelectedShape()通过StdSelect_…

C语言——rand函数

一、rand函数 这是一个在 C 标准库 <stdlib.h> 中定义的函数&#xff0c;用于生成伪随机数&#xff0c;默认情况下&#xff0c;它生成从 0 到 RAND_MAX 的伪随机数&#xff0c;其中 RAND_MAX 是一个常数&#xff0c;通常是 32767。 1、函数原型&#xff1a; 2、函数返回…

MongoDB的分片集群

MongoDB分片技术 介绍 ​ 分片&#xff08;sharding&#xff09;是MongoDB用来将大型集合分割到不同服务器上采用的方法。分片这种说法起源于关系型数据库。但是实际上非关系型数据库在分片方面相比于传统的关系型数据库更有优势。 ​ 与MySQL分库方案对比&#xff0c;MongoDB…

my-room-in-3d中的电脑,电视,桌面光带发光原理

1. my-room-in-3d中的电脑&#xff0c;电视&#xff0c;桌面光带发光原理 最近在github中&#xff0c;看到了这样的一个项目&#xff1b; 项目地址 我看到的时候&#xff0c;蛮好奇他这个光带时怎么做的。 最后发现&#xff0c;他是通过&#xff0c;加载一个 lightMap.jpg这个…

分布式与一致性协议之一致哈希算法(二)

一致哈希算法 使用哈希算法有什么问题 通过哈希算法&#xff0c;每个key都可以寻址到对应的服务器&#xff0c;比如&#xff0c;查询key是key-01,计算公式为hash(key-01)%3,警告过计算寻址到了编号为1的服务器节点A&#xff0c;如图所示。 但如果服务器数量发生变化&#x…

分享一篇关于AGI的短文:苦涩的教训

学习强化学习之父、加拿大计算机科学家理查德萨顿&#xff08; Richard S. Sutton &#xff09;2019年的经典文章《The Bitter Lesson&#xff08;苦涩的教训&#xff09;》。 文章指出&#xff0c;过去70年来AI研究走过的最大弯路&#xff0c;就是过于重视人类既有经验和知识&…

STM32控制DS1302时钟模块获取实时时间

时间记录&#xff1a;2024/3/30 一、知识点 &#xff08;1&#xff09;读写数据时序&#xff08;伪SPI协议&#xff09; 1.1 读写时序默认电平均为SCLK线低电平&#xff0c;CE线低电平 1.2 写数据&#xff0c;CE线拉高为高电平&#xff0c;开始传输数据&#xff0c;然后准备数…

2024年5月青岛教师编招聘报名详细流程

2024年5月青岛教师编招聘报名详细流程

【开发记录】青龙面板设置飞书机器人

接上篇文章&#xff0c;笔者在写上篇文章时对青龙面板的消息通知功能感兴趣&#xff0c;遂实验之&#xff0c;于是有了这篇文章。 首先参考这篇文章在群聊中引入一个机器人&#xff0c;此时可以获得该机器人的webhook。在青龙面板的通知设置中有larkKey一项&#xff0c;填入web…

[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)

文章涉及具体代码gitee&#xff1a; 登录 - Gitee.com 目录 1.插入排序 1.直接插入排序 总结 2.希尔排序 总结 2.选择排序 1.选择排序 ​编辑 总结 2.堆排序 总结 3.交换排序 1.冒泡排序 总结 2.快速排序 总结 4.归并排序 总结 5.总的分析总结 1.插入排…

用队列实现栈——leetcode刷题

题目的要求是用两个队列实现栈&#xff0c;首先我们要考虑队列的特点&#xff1a;先入先出&#xff0c;栈的特点&#xff1a;后入先出&#xff0c;所以我们的目标就是如何让先入栈的成员后出栈&#xff0c;后入栈的成员先出栈。 因为有两个队列&#xff0c;于是我们可以这样想&…

[Java EE] 多线程(七): 锁策略

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (90平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

ZOC8 for Mac v8.08.1激活版:卓越性能的SSH客户端

在远程连接和管理的世界中&#xff0c;ZOC8 for Mac以其卓越的性能和丰富的功能&#xff0c;成为了众多专业人士的首选SSH客户端。它支持SSH1、SSH2、Telnet、Rlogin、Serial等多种协议&#xff0c;让您轻松连接到远程服务器。ZOC8拥有简洁直观的界面和强大的功能设置&#xff…