【算法练习Day13】二叉树的层序遍历翻转二叉树对称二叉树

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 二叉树的层序遍历
  • 翻转二叉树
  • 对称二叉树
  • 总结:

二叉树的层序遍历

二叉树的层序遍历就是广度优先搜索的一种典型实例,题解思路十分重要,先说广搜的原理,它的原理就是使用队列这个数据结构将每一层需要遍历的数据放入到队列中,然后将他们的下一层放入队列后,取出本层的数据,循环往复,直到队列为空,说明遍历结束

102. 二叉树的层序遍历 - 力扣(LeetCode)

这道题是考察广搜的经典题目

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*>q;vector<vector<int>>result;vector<int>res;if(root)q.push(root);while(!q.empty()){int size=q.size();while(size--){// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的TreeNode*node=q.front();q.pop();res.push_back(node->val);if(node->left)q.push(node->left);if(node->right)q.push(node->right);}result.push_back(res);res.clear();}return result;}
};

前面已经说了广搜要创建队列,我们创建好队列了之后 将头节点加入队列,然后创立一个size变量用来保存当前数层中元素的个数,这一点很重要,我们要知道当前数层中有几个数据,才能知道要取出几个数据,接着我们进入循环,在循环中用size来判断多久跳出循环,在循环中我们要做的事情就是将数据加入答案数组中,以及将本层数据节点的全部左右孩子都加入进来(实际上每次加入的是队列头部元素的左右孩子,通过不断循环,最后才都加入进来),最后将本层数组加入最后的数组,不要忘记将本层数组清空再进行下一次的循环。

递归法

class Solution {
public:void order(TreeNode* cur, vector<vector<int>>& result, int depth){if (cur == nullptr) return;if (result.size() == depth) result.push_back(vector<int>());result[depth].push_back(cur->val);order(cur->left, result, depth + 1);order(cur->right, result, depth + 1);}vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> result;int depth = 0;order(root, result, depth);return result;}
};

翻转二叉树

226. 翻转二叉树 - 力扣(LeetCode)

翻转二叉树实际上就是沿着对称轴反转,注意不能直接交换节点的数值,而是要交换指针。

这道题刚做的时候不太有思路,不知道从何做起,后来看了题解才明白。
思路为将二叉树的左右孩子节点依次反转,即能完成题目要求

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if(root==nullptr)return root;invertTree(root->left);invertTree(root->right);swap(root->left,root->right);return root;}
};

前两步就是一直向下找,直到找到最左侧的节点,然后走第二步递归找到和最左侧相邻的右侧节点,然后进行交换节点,完成节点指针交换,代码十分的简洁,利于理解。这样的代码风格有点类似于二叉树中的后序遍历顺序,实际上前序也是可以的,它只不过是先将根节点的左右孩子节点反转,再向下遍历反转,后序是先反转最下面的节点,区别仅此而已,都可以完成题目要求。

但是值得一提的是,中序并不只是将交换数据的代码插入到中间而已,经过二叉树翻转模拟可知,中序翻转时,先翻转左子树后左右子树会交换,这时我们在处理右子树,实际上是处理刚才刚处理过的左子树,实际上的右子树并没有经过处理,所以要把第二三句代码改为root->left才能够完成对真正右子树的翻转。

对称二叉树

101. 对称二叉树 - 力扣(LeetCode)

对称二叉树的这道题和上一道题翻转二叉树的思路有着某些相似之处。起初我以为是要将该二叉树翻转之后,判断和之前二叉树是否相等呢,但是实际做的时候遇到了一些问题,比如要做模板的二叉树也就是没改动之前的二叉树怎么存储呢?实际上这种做法浪费了更多的空间。

更好的思路应该是:判断二叉树的外侧对应各节点和内侧的对应各节点是否完全相等,如果相等则说明是对称二叉树,这样的思路并不需要额外开辟空间,实践运用上我想应该和上一种思路差不多,都要递归遍历求解。

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);}
};

代码虽然没有那么简洁,但是思路十分清晰,先是把我们可能跳出递归的所有可能都列了出来,即左节点为空右节点不为空,左节点不为空但是右节点为空的情况,还有左右节点不为空但是值不对应相等这三种判断完了之后,那就剩下左右都为空或者都不为空且对应值相等,很明显这两种都是合法的,这里针对都不为空且对应值相等我们不做判断的原因是因为前面能跳出的情况我们都做了判断,并且两节点不为空且值相等并不是判断正确的理由,它仅仅是我们当前对应节点正确,它应该是我们能够向下遍历的一个原因,而当全部节点都对应完了,还没跳出,两个指向应该同时指向空,代表了当前内侧或外侧遍历完毕对应相等,所以我们这时候再进行判断true。

总结:

今天我们完成了二叉树的层序遍历、翻转二叉树、对称二叉树三道题目,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

【二】spring boot-设计思想

spring boot-设计思想 简介&#xff1a;现在越来越多的人开始分析spring boot源码&#xff0c;拿到项目之后就有点无从下手了&#xff0c;这里介绍一下springboot源码的项目结构 一、项目结构 从上图可以看到&#xff0c;源码分为两个模块&#xff1a; spring-boot-project&a…

ipa文件怎么把应用上架到苹果ios系统下载的App Store商城

注册为苹果开发者&#xff1a;首先&#xff0c;您需要注册为苹果开发者。前往苹果开发者网站&#xff08;https://developer.apple.com/&#xff09;&#xff0c;点击"Enroll"按钮&#xff0c;并按照相关步骤注册和付费&#xff08;开发者账号需要年度费用&#xff0…

SpringCloud Alibaba - Seata 四种分布式事务解决方案(TCC、Saga)+ 实践部署(下)

目录 一、Seata 分布式解决方案 1.1、TCC 模式 1.1.1、TCC 模式理论 对比 TCC 和 AT 模式的一致性和隔离性 TC 的工作模型 1.2.2、TCC 模式优缺点 1.2.3、TCC 模式注意事项&#xff1a;空回滚 1.2.4、TCC 模式注意事项&#xff1a;业务悬挂 1.2.5、实现 TCC 模式 案例…

(六)正点原子STM32MP135移植——内核移植

目录 一、概述 二、编译官方代码 三、移植 四、编译 一、概述 前面已经移植好了TF-A、optee、u-boot&#xff0c;在u-boot能正常跑起来的情况下&#xff0c;现在来移植内核。 二、编译官方代码 进入kernel目录 2.1 解压源码、打补丁 /* 解压源码 */ tar xf linux-6.1.28.…

【Go语言实战】(25) 分布式算法 MapReduce

MapReduce 写在前面 身为大数据专业的学生&#xff0c;其实大学我也多多少少接触过mapreduce&#xff0c;但是当时觉得这玩意太老了&#xff0c;觉得这和php一样会被时代淘汰。只能说当时确实太年轻了&#xff0c;没有好好珍惜那时候的学习资源… 现在回过头来看mapreduce&a…

想做好接口测试,先把这些概念搞清楚了

接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口 比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你提供一个他们写好的方法来获取数据&#xff0c;你引用…

【BBC新闻文章分类】使用 TF 2.0和 LSTM 的文本分类

一、说明 NLP上的许多创新是如何将上下文添加到词向量中。常见的方法之一是使用递归神经网络

数据结构之带头双向循环链表

目录 链表的分类 带头双向循环链表的实现 带头双向循环链表的结构 带头双向循环链表的结构示意图 空链表结构示意图 单结点链表结构示意图 多结点链表结构示意图 链表创建结点 双向链表初始化 销毁双向链表 打印双向链表 双向链表尾插 尾插函数测试 双向链表头插 …

如何选择合适的自动化测试工具?

自动化测试是高质量软件交付领域中最重要的实践之一。在今天的敏捷开发方法中&#xff0c;几乎任一软件开发过程都需要在开发阶段的某个时候进行自动化测试&#xff0c;以加速回归测试的工作。自动化测试工具可以帮助测试人员以及整个团队专注于自动化工具无法处理的各自任务&a…

【数据结构---排序】很详细的哦

本篇文章介绍数据结构中的几种排序哦~ 文章目录 前言一、排序是什么&#xff1f;二、排序的分类 1.直接插入排序2.希尔排序3.选择排序4.冒泡排序5.快速排序6.归并排序总结 前言 排序在我们的生活当中无处不在&#xff0c;当然&#xff0c;它在计算机程序当中也是一种很重要的操…

关掉在vscode使用copilot时的提示音

1. 按照图示的操作File --> Preferences --> Settings 2. 搜索框输入关键字Sound&#xff0c;因为是要关掉声音&#xff0c;所以找有关声音的设置 3. 找到如下图所示的选项 Audio Cues:Line Has Inline Suggetion,将其设置为Off 这样&#xff0c;就可以关掉suggest code时…

Elasticsearch:什么时候应该考虑在 Elasticsearch 中添加协调节点?

仅协调节点&#xff08;coordinating only nodes&#xff09;充当智能负载均衡器。 仅协调节点的这种特殊角色通过减轻数据和主节点的协调责任&#xff0c;为广泛的集群提供了优势。 加入集群后&#xff0c;这些节点与任何其他节点类似&#xff0c;都会获取完整的集群状态&…

毕业设计选题之Android基于移动端的线上订餐app外卖点餐安卓系统源码 调试 开题 lw

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

C# - Opencv应用(1) 之VS下环境配置详解

C# - Opencv应用&#xff08;1&#xff09; 之VS下环境配置详解 有时候&#xff0c;单纯c#做前端时会联合C实现的dll来落地某些功能由于有时候会用C - Opencv实现算法后封装成dll&#xff0c;但是有时候会感觉麻烦&#xff0c;不如直接通过C#直接调用Opencv在此慢慢总结下C# -…

SpringBoot vue云办公系统

SpringBoot vue云办公系统 系统功能 云办公系统 登录 员工资料管理: 搜索员工 添加编辑删除员工 导入导出excel 薪资管理: 工资账套管理 添加编辑删除工资账套 员工账套设置 系统管理: 基础信息设置 部门管理 职位管理 职称管理 权限组管理 操作员管理 开发环境和技术 开发语…

选择适合户外篷房企业的企业云盘解决方案

“户外篷房企业用什么企业云盘好&#xff1f;Zoho WorkDrive企业网盘可以帮助户外篷房企业实现文档统一管理、提高工作效率、加强团队协作&#xff0c;并且支持各种文件类型的预览和编辑。” S公司是一家注重管理规范的大型户外篷房企业&#xff0c;已经有10余年的经验。作为设…

string和const char*参数类型选择的合理性对比

在编程中&#xff0c;我们经常需要处理字符串类型的参数。在C中&#xff0c;有两种常见的表示字符串的参数类型&#xff0c;即string和const char*。本文将对比这两种参数类型的特点&#xff0c;分析其在不同情况下的合理性&#xff0c;以便程序员能够根据实际需求做出正确的选…

Docker安装ActiveMQ

ActiveMQ简介 官网地址&#xff1a;https://activemq.apache.org/ 简介&#xff1a; ActiveMQ 是Apache出品&#xff0c;最流行的&#xff0c;能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,…

次方计数的拆贡献法(考虑组合意义)+限定类问题善用值域与位置进行ds:1006T3

对于多次方的计数问题可以考虑拆贡献。 题目问 ∣ S ∣ 3 |S|^3 ∣S∣3&#xff0c; ∣ S ∣ |S| ∣S∣ 表示选的点数。相当于在 ∣ S ∣ |S| ∣S∣ 中选了3次&#xff0c;也就是选了3个可相同的点。 先考虑3个不相同点的贡献&#xff0c;对应任意3个点&#xff0c;必然会对…

【小工具-生成合并文件】使用python实现2个excel文件根据主键合并生成csv文件

1 小工具说明 1.1 功能说明 一般来说&#xff0c;我们会先有一个老的文件&#xff0c;这个文件内容是定制好相关列的表格&#xff0c;作为每天的报告。 当下一天来的时候&#xff0c;需要根据新的报表文件和昨天的报表文件做一个合并&#xff0c;合并的时候就会出现有些事新增…