代码随想录算法训练营第15天 | 102. 二叉树的层序遍历 + 226. 翻转二叉树 + 101. 对称二叉树

今日内容

  •  102.层序遍历  
  •  226.翻转二叉树 
  •  101.对称二叉树

102.二叉树的层序遍历 - Medium

题目链接:力扣-102. 二叉树的层序遍历

给你二叉树的根节点  root ,返回其节点值的  层序遍历 。 (即逐层地,从左到右访问所有节点)。

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

226.翻转二叉树 - Easy

题目链接:. - 力扣(LeetCode)

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

    示例 1:

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

 思路:前序遍历,层序遍历,递归法

递归法

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

 前序遍历

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;stack<TreeNode*> st;st.push(root);while(!st.empty()) {TreeNode* node = st.top();              // 中st.pop();swap(node->left, node->right);if(node->right) st.push(node->right);   // 右if(node->left) st.push(node->left);     // 左}return root;}
};

 层序遍历

class Solution {
public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> que;if (root != NULL) que.push(root);while (!que.empty()) {int size = que.size();for (int i = 0; i < size; i++) {TreeNode* node = que.front();que.pop();swap(node->left, node->right); // 节点处理if (node->left) que.push(node->left);if (node->right) que.push(node->right);}}return root;}
};

101. 对称二叉树 - Easy

题目链接:. - 力扣(LeetCode)

    给你一个二叉树的根节点 root , 检查它是否轴对称。

    示例 1:
    输入:root = [1,2,2,3,4,4,3]
    输出:true
    示例 2:
    输入:root = [1,2,2,null,3,null,3]
    输出:false

思路:递归法,队列迭代法,栈迭代法

递归法

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

队列迭代法

class Solution {
public:bool isSymmetric(TreeNode* root) {if (root == NULL) return true;queue<TreeNode*> que;que.push(root->left);   // 将左子树头结点加入队列que.push(root->right);  // 将右子树头结点加入队列while (!que.empty()) {  // 接下来就要判断这两个树是否相互翻转TreeNode* leftNode = que.front(); que.pop();TreeNode* rightNode = que.front(); que.pop();if (!leftNode && !rightNode) {  // 左节点为空、右节点为空,此时说明是对称的continue;}// 左右一个节点不为空,或者都不为空但数值不相同,返回falseif ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {return false;}que.push(leftNode->left);   // 加入左节点左孩子que.push(rightNode->right); // 加入右节点右孩子que.push(leftNode->right);  // 加入左节点右孩子que.push(rightNode->left);  // 加入右节点左孩子}return true;}
};

栈迭代法

class Solution {
public:bool isSymmetric(TreeNode* root) {if (root == NULL) return true;stack<TreeNode*> st; // 这里改成了栈st.push(root->left);st.push(root->right);while (!st.empty()) {TreeNode* leftNode = st.top(); st.pop();TreeNode* rightNode = st.top(); st.pop();if (!leftNode && !rightNode) {continue;}if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {return false;}st.push(leftNode->left);st.push(rightNode->right);st.push(leftNode->right);st.push(rightNode->left);}return true;}
};

今日总结

主要是对遍历方法的选择和运用,做题前考虑好使用哪种遍历方法

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

Matlab 之数据分布拟合

文章目录 Part.I IntroductionPart.II Distribution Fitter APP 的使用Chap.I APP 简介Chap.II 简单使用 Part.III 通过代码实现分布拟合Chap.I 基于 fitdist 函数Chap.II 获取数据的频率分布后进行曲线拟合 Reference Part.I Introduction 本文主要介绍了如何使用 Matlab 对数…

Xcalibur软件Qual Brower程序的使用

找到Qual Brower&#xff1a;在System>Program里 打开采集的数据文件*.RAW&#xff0c;软件界面主窗口能查看色谱图和质谱图&#xff1a; 1、图形的放大和拷贝、色谱中查看峰的质谱信息&#xff1a; 点亮如图图像右上角的按钮&#xff0c;可以激活该图形并进行操作&#x…

JavaScript日期和时间处理手册

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 日期和时间在应用开发中是非常常用的功能。本文将全面介绍JavaScript中处理日期和时间的方…

专业课128分总分400+南京理工大学818信号系统与数字电路南理工考研经验分享

专业课128分总分400南京理工大学818信号系统与数字电路南理工电光院考研经验分享&#xff0c;希望自己的经历对大家有借鉴。 我是在六月底确认自己保不上研然后专心备考的&#xff0c;时间确实比较紧张。虽然之前暑假看了一点高数&#xff0c;但因为抱有保研的期望&#xff0c…

电机PCB设计注意事项

电机PCB设计注意事项 电机的布局和布线以及相关的电气注意事项这里参考的是TI的文章&#xff0c;文章的链接如下&#xff1a; 电机驱动器电路板布局的最佳实践 布线时的注意 首先是布线的宽度: 大电流的布线经过我自己的测试&#xff0c;大概50mil-100mil左右&#xff0c;我…

SPI协议介绍

文章目录 一、硬件连线二、引脚含义三、传输示例四、传输模式 一、硬件连线 二、引脚含义 引脚含义DO&#xff08;MOSI - Master Output Slave Input&#xff09;主机发数据&#xff0c;从机收数据DI&#xff08;MISO - Master Input Slave Output&#xff09;主机收数据&…

HarmonyOS4.0系统性深入开发15Want概述

Want概述 Want的定义与用途 Want是对象间信息传递的载体&#xff0c;可以用于应用组件间的信息传递。其使用场景之一是作为startAbility()的参数&#xff0c;包含了指定的启动目标以及启动时需携带的相关数据&#xff0c;如bundleName和abilityName字段分别指明目标Ability所…

linux系统关于nginx服务

nginx服务 nginx服务nginx特点IO多路复用I/O multiplexing【多并发】epoll接收请求的过程异步&#xff0c;非阻塞 nginx 的内部技术架构 nginx服务 nginx特点 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c…

金和OA C6 upload_json 任意文件上传漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA C6 upload_json接口处存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊请求包上…

LTESniffer:一款功能强大的LTE上下行链路安全监控工具

关于LTESniffer LTESniffer是一款功能强大的LTE上下行链路安全监控工具&#xff0c;该工具是一款针对LTE的安全开源工具。 该工具首先可以解码物理下行控制信道&#xff08;PDCCH&#xff09;并获取所有活动用户的下行链路控制信息&#xff08;DCI&#xff09;和无线网络临时…

三分钟教你学会设置PICO不自动休眠

三分钟教你学会设置PICO不自动休眠 大家经常会有这种困扰吧&#xff0c;“诶&#xff0c;我去倒杯水&#xff0c;怎么屏幕就黑了”或者“啊这个活动怎么要在线看这么久&#xff0c;好想去玩手机”之类的。会出现这种问题是因为PICO将自动休眠的时间设置得非常短&#xff0c;大…

Flink-CEP 实战教程

文章目录 1. 基本概念1.1 CEP 是什么1.2 模式&#xff08;Pattern&#xff09;1.3 应用场景 2. 快速上手2.1 引入依赖2.2 入门实例 3. 模式API&#xff08;Pattern API&#xff09;3.1 个体模式3.1.1 基本形式3.1.2 量词&#xff08;Quantifiers &#xff09;3.1.3 条件&#x…

GBASE南大通用分析型MPP数据库GBase8a的安全特性(2)

GBase南大通用自主研发的 GBase 8a MPP Cluster 产品&#xff08;简称GBase8a)是大数据时代成熟的分析型MPP数据库&#xff0c;具有多样化的平台选择、与时俱进的逻辑架构、海量数据高效存储、海量数据高速加载、海量数据高性能分析、弹性服务器资源伸缩、完善的系统资源管理、…

Ubuntu18.04 Qt 实现MQTT

什么是MQTT&#xff1f; 作用是什么&#xff08;适用场景&#xff09;&#xff1f; 与其他通讯协议相比&#xff0c;优缺点在那里&#xff1f; 一.实现 MQTT 服务器 使用 EMQ X&#xff08;开源且可视化管理&#xff09; 下载 EMQX 下载的是 emqx-5.0.26-ubuntu18.04-…

AI Agent落地先行者实在智能:2023人工智能领军者、百强、TOP30揭榜

实在智能连登三榜&#xff01; 【2023年十佳人工智能行业领军人物】 【2023年度人工智能领域创新企业】 【2023年度最具投资价值企业】 喜大普奔&#xff01;近期&#xff0c;国内科技行业颇具含金量的三张榜单接连发布&#xff0c;实在智能皆榜上有名&#xff0c;“2023「…

网络编程套接字(Socket)

文章目录 1 重点知识2 预备知识2.1 理解源IP地址和目的IP地址2.2 认识端口号2.3 理解 "端口号" 和 "进程ID"2.4 理解源端口号和目的端口号2.5 认识TCP协议2.6 认识UDP协议2.7 网络字节序 3 socket编程接口3.1 socket 常见API3.2 sockaddr结构 4 简单的UDP网…

RT-Thread基于AT32单片机的485应用开发(三)Modbus从机

RT-Thread中已经有不少Modbus相关在线软件包&#xff0c;但总体应用起来还是相对复杂&#xff0c;所以在RT-Thread基于AT32单片机的485应用开发&#xff08;二&#xff09;的基础上实现了一个极简Modbus从机&#xff0c;支持Modbus功能码01&#xff0c;02&#xff0c;03&#x…

Android 车联网——其他Service介绍(十七)

除了前面介绍的 Service 和 Manager 之外,CarService 中还提供了很多其他 Service 和 Manager。 1、CarInputService CarInputService 是一个安卓汽车平台中的服务,它负责处理与车辆输入设备相关的操作,例如处理车辆上的按钮、方向盘控制、触摸屏输入等。该服务允许…

常用工具集合

摘要&#xff1a;更换电脑进行工具迁移&#xff0c;做一个记录。 1、前端 vscode plugins&#xff1a;Chinese (Simplified) (简体中文) Easy Sass: scss编辑生成css文件 Live Server: Launch a local development server with live reload 2、后端 idea 3、移动端 Android …

【Java集合篇】 ConcurrentHashMap在哪些地方做了并发控制

ConcurrentHashMap在哪些地方做了并发控制 ✅典型解析✅初始化桶阶段&#x1f7e2;桶满了会自动扩容吗&#x1f7e0;自动扩容的时间频率是多少 ✅put元素阶段✅扩容阶段&#x1f7e0; 拓展知识仓&#x1f7e2;ConcurrentSkipListMap和ConcurrentHashMap有什么区别☑️简单介绍一…