二叉树练习题(2024/6/5)

1翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

递归思路:

  1. 首先,检查根节点是否为空,如果为空则直接返回空节点。
  2. 对于每个非空节点,交换其左右子树(即将左子树和右子树进行交换)。
  3. 递归地对左子树调用 invertTree 函数,实现左子树的翻转。
  4. 递归地对右子树调用 invertTree 函数,实现右子树的翻转。
  5. 最后返回根节点,完成整棵二叉树的翻转操作。

递归代码:

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;swap(root->left, root->right);  // 交换左右子树invertTree(root->left);         // 递归处理左子树invertTree(root->right);        // 递归处理右子树return root;}
};

迭代思路:

首先检查根节点是否为空,如果为空则返回0。随后创建一个栈,将根节点压入栈中。在循环中,不断取出栈顶元素,交换其左右子树,并将存在的左子树和右子树压入栈中。当栈为空时,所有节点都已经遍历并翻转,返回根节点完成翻转操作

迭代代码:

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return 0; // 若根节点为空,则返回0stack<TreeNode*> st; // 创建一个栈用于存储待处理节点st.push(root); // 将根节点入栈while (!st.empty()) { // 当栈不为空时TreeNode* node = st.top(); // 获取栈顶元素st.pop(); // 弹出栈顶元素swap(node->left, node->right); // 交换当前节点的左右子树if (node->left) st.push(node->left); // 如果左子树不为空,则将其入栈if (node->right) st.push(node->right); // 如果右子树不为空,则将其入栈}return root; // 返回翻转后的树的根节点}
};

2对称二叉树

给你一个二叉树的根节点 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. 左右节点为空情况:当左节点为空而右节点不为空,或者左节点不为空而右节点为空时,这种情况下两个节点不对称。

  3. 节点值不相等:如果左右节点的值不相等,那么这两个节点不对称。

  4. 子树不对称:如果左节点的左子树与右节点的右子树不对称,或者左节点的右子树与右节点的左子树不对称,那么这两个节点也不对称。

代码:

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);  // 调用递归函数比较左右子树}
}

3二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

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

示例 2:

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

递归思路:

  1. etdepth 函数:用于计算树的深度。若根节点为空,则深度为0;否则分别递归计算左子树和右子树的深度,并取其中较大的深度加1作为当前节点的深度。

  2. maxDepth 函数:是主函数,直接调用 getdepth 函数计算二叉树的最大深度,并返回结果。

递归代码:

class Solution {
public:// 递归函数,用于计算树的深度int getdepth(TreeNode* root) {if (root == NULL) return 0; // 如果根节点为空,深度为0int leftdepth = getdepth(root->left);       // 递归获取左子树的深度int rightdepth = getdepth(root->right);     // 递归获取右子树的深度int depth = 1 + max(leftdepth, rightdepth); // 当前节点的深度为左右子树深度的最大值加1return depth; // 返回当前节点的深度}// 主函数,获取二叉树的最大深度int maxDepth(TreeNode* root) {return getdepth(root); // 调用计算深度的递归函数}
};

迭代思路:

  1. 首先判断根节点是否为空,若为空则直接返回深度为0。

  2. 创建一个队列 que 存储节点,并将根节点放入队列。

  3. 进入循环,每次循环代表遍历一层节点,增加深度。

  4. 遍历当前层的节点,取出队首节点,如果存在左子节点,则将左子节点入队;如果存在右子节点,则将右子节点入队。

  5. 继续循环直到队列为空,返回最大深度。

迭代代码:

class Solution {
public:// 计算二叉树的最大深度int maxDepth(TreeNode* root) {if (root == nullptr) return 0; // 如果根节点为空,深度为0int maxDepth = 0; // 初始化最大深度为0queue<TreeNode*> que; // 创建一个队列存储节点que.push(root); // 根节点入队while (!que.empty()) { // 当队列不为空时循环int size = que.size(); // 获取当前队列的大小,即当前层节点数maxDepth++; // 对应深度加1for (int i = 0; i < size; i++) {TreeNode* node = que.front(); // 取出队首节点que.pop(); // 队首节点出队if (node->left) que.push(node->left); // 如果左子节点存在,将左子节点入队if (node->right) que.push(node->right); // 如果右子节点存在,将右子节点入队}}return maxDepth; // 返回二叉树的最大深度}
};

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

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

相关文章

dirfuzz-web敏感目录文件扫描工具

dirfuzz介绍 dirfuzz是一款基于Python3的敏感目录文件扫描工具&#xff0c;借鉴了dirsearch的思路&#xff0c;扬长避短。在根据自身实战经验的基础上而编写的一款工具&#xff0c;经过断断续续几个月的测试、修改和完善。 项目地址&#xff1a;https://github.com/ssrc-c/di…

运维开发介绍

目录 1.什么是运维开发 2.作用 3.优点 4.缺点 5.应用场景 5.1.十个应用场景 5.2.网站和Web应用程序 6.案例 7.小结 1.什么是运维开发 运维开发&#xff08;DevOps&#xff09;是一种结合软件开发&#xff08;Development&#xff09;与信息技术运维&#xff08;Opera…

什么是回调函数?callback()

首先要知道一个点就是 在js中&#xff0c;函数是可以作为函数的参数传递的 所以其实回调函数 就是这个传进去的参数 其实回调函数的本质样子和普通函数是一样的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

embedding层的理解

一文读懂Embedding的概念&#xff0c;以及它和深度学习的关系 - 知乎 (zhihu.com) 感觉这篇知乎真的大道至简。个人感觉embedding层和普通的线性层没有什么区别~就是为了降维和升维用的。也就是向量的维度变化&#xff01;

基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真&#xff0c;输出收敛曲线以及三维曲面最高点搜索结果。 2.测试软件版本以及运行结果展示 MATLAB2022A版本…

Wireshark抓包工具使用 项目实战

Wireshark 是一个开源的网络协议分析器&#xff0c;它可以让你捕获和分析网络数据包&#xff0c;帮助你诊断网络问题、监控网络流量、分析协议和进行安全审计。以下是一些基本的 Wireshark 用法&#xff1a; 捕获数据包&#xff1a; 打开 Wireshark&#xff0c;选择要捕获数据包…

国外创意二维码营销案例:巴西宠物食品品牌户外活动“救救宠物爪子吧”

2024年5月份&#xff0c;巴西宠物食品品牌Purina Brasil 与广告公司Publicis Brasil合作&#xff0c;推出了一次特别的户外营销活动——Salve as Patinhas(Save the Paws)&#xff08;救救宠物爪子吧&#xff09;&#xff0c;非常有意思&#xff01; 随着全球气候变暖&#xf…

C++240605

设计一个 Per类&#xff0c;类中包含**私有**成员:姓名、年龄、**指针成员**身高、体重&#xff0c; 再设计一个Stu类&#xff0c;类中包含**私有**成员:成绩、 Per类对象p1&#xff0c; 设计这 两个类 的 **构造函数、析构函数**。 #include <iostream>using namespace…

PPT文件损坏且无法读取怎样修复?文档损坏修复方法推荐

PPT文件已经成为工作汇报、商务演示、学术交流以及教学培训中最常用到的文件&#xff0c;随着文件数量的增多和存储设备的频繁使用&#xff0c;我们有时会遇到PPT文件损坏无法打开的情况&#xff0c;这无疑给工作和学习带来了极大的困扰。 PPT文件损坏的原因可能多种多样&#…

VS2022,DLL1调用lib,lib调用DLL2

DLL1调用lib&#xff0c;lib调用DLL2 问题1&#xff1a;为什么在dll1中需要引入dll2的.lib文件 当你有一个工程&#xff08;dll1&#xff09;调用静态库&#xff08;lib&#xff09;&#xff0c;而静态库&#xff08;lib&#xff09;又调用另一个DLL&#xff08;dll2&#xf…

vivado BEL

描述 通常&#xff0c;BEL或基本元素对应于设计的网表视图中的叶单元。 BEL是目标Xilinx FPGA上的设备对象&#xff0c;用于放置或映射基本网表 触发器、LUT和进位逻辑等对象。 BEL在SITE对象&#xff08;如SLICE和IO块&#xff09;中的设备上分组在一起 &#xff08;IOB&#…

PostgreSQL专家(pcp51)--王丁丁

#PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试 #PG培训

雨课堂课件快速自动刷完

文章目录 背景f12检查 查看源代码脚本脚本使用方法总结 背景 有时候老师让我们在雨课堂里刷完这个课件。这个课件呢有时候它有三百多页&#xff0c;每一页需要停留3秒左右才可以算看过课件&#xff0c;你如果一页一页的去点的话非常的折磨人。因为课件太多页了&#xff0c;我就…

【数据库】SQL--DQL(初阶)

文章目录 DCL1. 基本介绍2. 语法2.1 基础查询2.2 条件查询2.3 聚合函数2.4 聚合查询2.5 分组查询2.6 排序查询2.7 分页查询2.8 综合案例练习2.9 执行顺序 3. DQL总结 DCL 更多数据库MySQL系统内容就在以下专栏&#xff1a; 专栏链接&#xff1a;数据库MySQL 1. 基本介绍 DQL英…

GLM-4-9B性能究竟如何?

GLM-4-9B 开源系列模型 前言 自 2023 年 3 月 14 日 ChatGLM-6B 开源以来&#xff0c;GLM 系列模型受到广泛认可。特别是在 ChatGLM3-6B 开源后&#xff0c;针对让小模型能够拥有更为强大的能力这一目标&#xff0c;GLM 技术团队展开了诸多的探索性工作。历经将近半年的探索历程…

风机5G智能制造工厂工业物联数字孪生平台,推进制造业数字化转型

风机5G智能制造工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。在信息化、智能化的浪潮中&#xff0c;风机5G智能制造工厂工业物联数字孪生平台正以其独特的优势&#xff0c;推动制造业实现数字化转型。数字孪生平台不仅为风机制造业带来了前所未有的机遇&#xf…

计算机图形学入门06:视口变换

在前面的内容中&#xff0c;在MVP变换(模型变换&#xff0c;视图变换&#xff0c;投影变换)完后&#xff0c;所有的物体位置都变换到了[-1, 1]的标准立方体里&#xff0c;下一步要把物体绘制到屏幕(Screen)上。 1.什么是屏幕&#xff1f; 对于图形学来说把屏幕抽象的认为是一个…

mac Network: use --host to expose

本地启动无法访问&#xff0c;这个不是权限问题是mac 主机端口安全策略&#xff0c;现在我们只需要开启端口自动检测就可以 npm run dev --host 网络&#xff1a;未暴露 方案一 1、执行 npm run dev -- --host 方案二 1、请在 vite.config.js server: {host: true } 1…

给快高考的儿子的一封信:关于选择计算机专业

亲爱的儿子&#xff0c; 你好&#xff01; 时间过得真快&#xff0c;转眼间你就要高考了&#xff0c;这不仅是你人生中的一个重要时刻&#xff0c;也是我们全家都非常关注的节点。妈妈告诉我&#xff0c;你对计算机专业很感兴趣&#xff0c;希望我能给你一些建议。我很高兴听…

使用手机小程序给证件照换底色

临时遇到一个需求&#xff0c;需要给证件照换底色。原始图像如下 最终需要换成红底的。 本次使用一款小程序&#xff02;泰世茂证件照&#xff02;&#xff0c;打开该小程序&#xff0c;如下图所示 单击开始制作&#xff0c;然后选择二寸红底&#xff0c;如下图所示 然后单击相…