【算法练习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…

00|漫展人物备注

1&#xff1a;紫色女孩 2 浪漫&#xff08;散兵&#xff09; 3. 雪 工具 1、画笔工具&#xff1a; 磨皮核心工具 2、仿制图章&#xff1a; 去掉不想要的部分。 按住Alt&#xff0c;左键点击想复制的地方&#xff0c;按住左键&#xff0c;点击想遮盖的地方 3、液化工具 选…

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

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

Java 创建线程的方法

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

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.…

3_使用传统CNN网络训练图像分类模型

使用传统CNN网络训练图像分类模型 1. MNIST 首先,定义一下超参数等 import torch# dataset input_shape = 28 num_classes = 10# hyper batch_size = 64 num_epochs = 5 learning_rate = 1e-3# gpu device = torch.device(cuda

RAID0_RAID1_RAID10_RAID5各需几块盘才可组建

RAID 0 RAID 0即Data Stripping&#xff08;数据分条技术&#xff09;。整个逻辑盘的数据是被分条&#xff08;stripped&#xff09;分布在多个物理磁盘上&#xff0c;可以并行读/写&#xff0c;提供最快的速度&#xff0c;但没有冗余能力。要求至少两个磁盘。我们通过RAID 0可…

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

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

使用UiPath和AA构建的解决方案 2. HelpDesk生成Ticket

让我们开始我们的第一个项目——使用UiPath实现简单的HelpDesk自动化。 HelpDesk代理从各种渠道获得输入,包括电话、电子邮件和电子表格,以创建和更新支持Ticket。支持Ticket是您通过致电HelpDesk代理以解决问题而提出的请求;例如,你的笔记本电脑不工作,或者你有互联网问题…

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

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

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

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

UDS诊断:87服务-LinkControl(链接控制服务)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍诊断和通讯管理功能单元下的87服务LinkControl,该服务可以用来改变网络传输速率,确切的说是客户端请求控制通信波特率。 文章目录 诊断协议那些事儿一、87服务-LinkControl主要应用场景二、请求格式子功能参数说明l…

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

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

Raid10--Raid01介绍

RAID10  先对磁盘做mirror&#xff0c;然后对整个mirror组做条带化&#xff1b;    比如8块盘    需要分成4个基组&#xff0c;每个基组2块盘&#xff1b;    每个基组先做raid1&#xff0c;再做raid0&#xff0c;4条条带化&#xff1b;    所以&#xff1a;   …

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

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

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

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

javascript选择框和选择文本的创建与增加以及设置选中项

<script type"text/javascript">//得到选中项的索引&#xff0c;文本和值函数function getselected(selectedIndex){var selectboxdocument.forms[0].elements["location"];var indexselectbox[selectedIndex];var selectedOptionselectbox.options[…

关掉在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;都会获取完整的集群状态&…