LeetCode之二叉树

发现更多计算机知识,欢迎访问Cr不是铬的个人网站

最近数据结构学到二叉树,就刷了刷力扣,写这篇文章也是辅助记忆。

103二叉树锯齿形遍历

file


要解出本道题,首先要会层次遍历。层次遍历我们都知道用一个队列去实现就行。但是力扣这里的输出时一个二维的vector,每一层的值在不同的列表里面。这里是一个难点。这个锯齿形遍历无非加一个判断本层是奇数还是偶数层,然后用内置的revers函数处理一下就可。

代码:

class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> ret; // 存储结果的二维向量queue<TreeNode*> dq; // 辅助队列用于层序遍历if (root == nullptr) {return ret; // 如果根节点为空,直接返回空结果}dq.push(root); // 将根节点入队int level = 1; // 层级标志,初始为1while (!dq.empty()) {int size = dq.size(); // 当前层的节点数vector<int> tmp; // 临时向量存储当前层的节点值for (int i = 0; i < size; i++) {TreeNode* node = dq.front(); // 取出队首节点dq.pop(); // 出队tmp.push_back(node->val); // 将节点值存入临时向量if (node->left != nullptr) {dq.push(node->left); // 左子节点入队}if (node->right != nullptr) {dq.push(node->right); // 右子节点入队}}if (level % 2 == 0) {reverse(tmp.begin(), tmp.end()); // 如果是偶数层级,将临时向量反转}ret.push_back(tmp); // 将当前层的节点值向量存入结果向量level++; // 层级标志自增}return ret; // 返回结果向量}
};

103对称二叉树

file

判断对称二叉树可以在判断完全相同的二叉树的基础上面进行。只是递归的时候变成了left->right ,rigth->left这种.

利用递归解决代码:

class Solution {
public:// 判断两个节点是否镜像对称bool isMirror(TreeNode* left, TreeNode* right) {if (left == nullptr && right == nullptr) {return true; // 如果两个节点都为空,则它们镜像对称} else if (left == nullptr || right == nullptr) {return false; // 如果其中一个节点为空,则它们不镜像对称} else {// 判断当前节点的值相等,并且左子树的左子节点与右子树的右子节点镜像对称,// 左子树的右子节点与右子树的左子节点镜像对称return (left->val == right->val) && isMirror(left->left, right->right) && isMirror(left->right, right->left);}}// 判断二叉树是否对称bool isSymmetric(TreeNode* root) {if (root == nullptr) {return true; // 如果根节点为空,则认为是对称的}return isMirror(root->left, root->right); // 判断根节点的左子树和右子树是否镜像对称}
};

isMirror函数中,如果两个节点都为空,则它们镜像对称;如果其中一个节点为空,则它们不镜像对称;否则,判断当前节点的值相等,并且左子树的左子节点与右子树的右子节点镜像对称,左子树的右子节点与右子树的左子节点镜像对称

由前序遍历与中序遍历得到树

file

这是一个非常经典的问题,这里我给出一个我觉得很容易理解的代码:

class Solution {
public:// 通过前序遍历和中序遍历构建二叉树的递归函数TreeNode* build(vector<int>& preorder, int l1, int r1, vector<int>& inorder, int l2, int r2) {TreeNode* root = new TreeNode(preorder[l1]); // 创建当前子树的根节点int i = l2;while (inorder[i] != root->val) {i++; // 在中序遍历中找到根节点的位置}int Llen = i - l2; // 计算左子树的长度int Rlen = r2 - i; // 计算右子树的长度if (Llen <= 0) {root->left = nullptr; // 如果左子树长度小于等于0,说明左子树为空} else {// 递归构建左子树,左子树的前序遍历范围为[l1+1, l1+Llen],中序遍历范围为[l2, i-1]root->left = build(preorder, l1 + 1, l1 + Llen, inorder, l2, i - 1);}if (Rlen <= 0) {root->right = nullptr; // 如果右子树长度小于等于0,说明右子树为空} else {// 递归构建右子树,右子树的前序遍历范围为[l1+Llen+1, r1],中序遍历范围为[i+1, r2]root->right = build(preorder, l1 + Llen + 1, r1, inorder, i + 1, r2);}return root; // 返回当前子树的根节点}// 构建二叉树TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int n = preorder.size(); // 前序遍历序列的长度int m = inorder.size(); // 中序遍历序列的长度TreeNode* root;root = build(preorder, 0, n - 1, inorder, 0, m - 1); // 调用递归函数构建二叉树return root; // 返回根节点}
};

考虑一下,如果要求的是从后序遍历和中序遍历得到树呢?上述代码该如何变化呢?

这里也贴上代码:

class Solution {
public:TreeNode* build(vector<int>& inorder, int l1, int r1, vector<int>& postorder, int l2, int r2){if (l1 > r1 || l2 > r2)return nullptr;TreeNode* root = new TreeNode(postorder[r2]);int i = l1;while (inorder[i] != root->val)i++;int Llen = i - l1;int Rlen = r1 - i;root->left = build(inorder, l1, i - 1, postorder, l2, l2 + Llen - 1);root->right = build(inorder, i + 1, r1, postorder, l2 + Llen, r2 - 1);return root;}TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int n = inorder.size();int m = postorder.size();TreeNode* root;root = build(inorder, 0, n - 1, postorder, 0, m - 1);return root;}
};

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

FSOD论文阅读 - 基于卷积和注意力机制的小样本目标检测

来源:知网 标题:基于卷积和注意力机制的小样本目标检测 作者:郭永红&#xff0c;牛海涛&#xff0c;史超&#xff0c;郭铖 郭永红&#xff0c;牛海涛&#xff0c;史超&#xff0c;郭铖&#xff0e;基于卷积和注意力机制的小样本目标检测 [J/OL]&#xff0e;兵工学报. https://…

AH8691-60V降压至3.3V电源芯片:ESOP8封装解决方案

AH8691-60V降压至3.3V电源芯片&#xff1a;ESOP8封装解决方案 随着电子设备的日益普及&#xff0c;电源管理芯片的重要性也日益凸显。一款高效率、低功耗的电源芯片可以大大提高电子设备的性能和可靠性。今天&#xff0c;我们将介绍一款60V降压至3.3V电源芯片&#xff0c;采用…

【React】React-Redux基本使用

容器组件和 UI 组件 所有的 UI 组件都需要有一个容器组件包裹 容器组件来负责和 Redux 打交道&#xff0c;可以随意使用 Redux 的API UI 组件无任何 Redux API 容器组件用于处理逻辑&#xff0c;UI 组件只会负责渲染和交互&#xff0c;不处理逻辑 在我们的生产当中&#xff0…

技术分享 | JMeter性能测试实现与分析

导语 JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具&#xff0c;它即能测试动态服务&#xff08;WebService&#xff09;&#xff0c;也能测试静态资源&#xff0c;包括Servlet服务、CGI脚本等&#xff0c;还能测试动态语言服务&#xff08;PHP、Java、ASP…

Vue向pdf文件中添加二维码

&#x1f680; 场景一&#xff1a;利用vue向pdf文件中写入二维码图片或其他图片 &#x1f680; 场景二&#xff1a;向pdf中添加水印 思路&#xff1a; 1、先通过url链接生成二维码&#xff0c;二维码存在于dom中 2、使用html2canvas库将二维码的dom转为一个canvas对象 3、根据c…

网络营销|如何利用line拓展东南亚市场

Line在亚洲地区非常流行&#xff0c;特别是在日本、台湾、泰国等地&#xff0c;是当地最受欢迎的即时通讯应用之一。 除了基本的聊天功能外&#xff0c;Line还提供了各种各样的贴图、表情包和游戏等娱乐功能&#xff0c;吸引了大量的用户。 一、选择利用line进行海外营销的原…

.net core中前端vue HTML5 History 刷新页面404问题

放到启动的应用程序的最后面 app.Run(async (context) > {context.Response.ContentType "text/html";await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); });https://blog.csdn.net/lee576/article/details/88355…

Nas搭建webdav服务器并同步Zotero科研文献

无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器 文章目录 无需云盘&#xff0c;不限流量实现Zotero跨平台同步&#xff1a;内网穿透私有WebDAV服务器一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zote…

OpenAI chatGPT又又又出bug!强制开通plus

自奥特曼宣布暂时停止plus用户的注册后&#xff0c;plus账号的价格水涨船高&#xff01; 现在教大家如何强制开通plus&#xff0c;体验gpt4等各种功能&#xff01; 如图&#xff1a; 打开官网进入后&#xff0c;按F12打开控制台&#xff0c;在控制台上输入代码 即可强制跳转至付…

使用Ant Design Pro开发时的一个快速开发接口请求的技巧

使用Ant Design Pro开发时的一个快速开发接口的技巧 当我们的后端在写好接口以后&#xff0c;我们通过swagger knife4j可以生成一个接口文档&#xff0c;后端启动以后&#xff0c;可以生成一个接口文档&#xff0c;当输入地址 localhost:8101/api/v3/api-docs &#xff08;这…

高德地图系列(一):vue项目如何使用高德地图、入门以及基本控件使用

目录 第一章 前言 第二章 准备工作 2.1 账号注册 2.2 高德地图开发平台文档 2.3 创建应用 第三章 使用地图 3.1 地图使用步骤 3.2 理解几个地图基础控件 3.3 基础类理解 第一章 前言 小编都是在vue项目中使用高德地图的&#xff0c;每一个功能都会亲测可用之后才会…

大语言模型|人工智能领域中备受关注的技术

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️其他领域】 文章目录 前言关于大语言模型大语言模型是什么&#xff1f;大语言模型有什么用?文案写作知识库回答文本分类代码生成 AWS 如何通过 LLM 提供帮助&#xff1f;Amazon BedrockAmazon SageM…

IDEA软件使用步骤

1.IDEA概述 IDEA全称InelliJ IDEA,是用于java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最好的工具。 集成环境&#xff1a;把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试扽过多种功能综合到一起的开发工具。 下载&#xff1a;https…

【C语言 | 数组】C语言数组详解(经典,超详细)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Unity开发之C#基础-异常处理(Try Catch)

前言 其实本来这章应该将栈和队列的 但是后来想想 栈和队列在实际应用很少跟多的是大家了解一下栈和队列的基本常识比如先进先出的是谁后进先出的是谁这种 csdn有很多介绍栈和队列的文章 我觉得都比我理解深刻所以大家可以去搜索参照一下 今天我们继续往下讲解 如何自己主动的…

如何从Android手机恢复已删除的联系人

联系人应该是最重要的信息之一。 如果您不小心从Android手机中删除了联系人&#xff0c;该怎么办&#xff1f; 如果不容易找回丢失的联系人&#xff0c;您可以使用奇客数据恢复安卓版。 从Android的手机中恢复已删除的联系人 只需删除Android联系人&#xff0c;然后您就可以通…

ubuntu中使用 vscode 连接docker开发环境

文章目录 ubuntu中使用 vscode 连接docker开发环境步骤一&#xff1a;安装 Remote Development 插件步骤二&#xff1a;连接远程环境步骤三&#xff1a;开发 问题解决参考连接 ubuntu中使用 vscode 连接docker开发环境 Remote Development 是一个 Visual Studio Code 插件&…

WPF小知识

在编写WPF程序遇到一些小问题&#xff0c;所以记录起来&#xff0c;查其他方便。 Label自动换行 网上搜的都不能自动换行&#xff0c;发现使用Run 就可以。在脚本中直接调用labTip.Text进行赋值就可以了。 <Label Foreground"#FF9E9E9E" FontSize"16"…

Google codelab WebGPU入门教程源码<4> - 使用Uniform类型对象给着色器传数据(源码)

对应的教程文章: https://codelabs.developers.google.com/your-first-webgpu-app?hlzh-cn#5 对应的源码执行效果: 对应的教程源码: 此处源码和教程本身提供的部分代码可能存在一点差异。 class Color4 {r: number;g: number;b: number;a: number;constructor(pr 1.0, …

【hive-解决】HiveAccessControlException Permission denied: CREATEFUNCTION

文章目录 一.任务描述二. 解决 一.任务描述 Error while compiling statement: FAILED: HiveAccessControlException Permission denied: Principal [nameroot, typeUSER] does not have following privileges for operation CREATEFUNCTION [ADMIN PRIVILEGE on INPUT, ADMIN…