【算法第十二天7.26】二叉树层序遍历,翻转二叉树,对称二叉树

链接力扣102-层序遍历

链接力扣102-层序遍历

思路
1、需要一个队列,当一个队列出队时,将其的孩子结点全部入队;
2、每一层的结点数如何找到:比如,第一层root进入队列后,得到len = queue.size(),就循环让其出队的同时,入队其孩子,等到这一层出队完了,其孩子结点也入队完了,再次得到len,就可以确定每层的结点数。

代码

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();// 创建暂存集合不应在这里创建,应该在循环内,这样每次循环都会有一个新的tmp集合// List<Integer> tmp = new ArrayList<>();Queue<TreeNode> queue = new LinkedList<>();if(root == null) return res;queue.offer(root);while(!queue.isEmpty()){int len = queue.size();// 每次循环都会有一个新的tmp集合List<Integer> tmp = new ArrayList<>();// while(len > 0){for(int i = 0; i < len; i++){TreeNode node = queue.poll();tmp.add(node.val);if(node.left != null) queue.offer(node.left);if(node.right != null) queue.offer(node.right);// len--;}res.add(tmp);}return res;}
}

链接力扣226-翻转二叉树

思路

非递归

与层序遍历类似,但是需要对每个出栈元素进行处理:交换其左右孩子

class Solution {public TreeNode invertTree(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();if(root == null) return root;queue.offer(root);while(!queue.isEmpty()){int len = queue.size();while(len > 0){TreeNode node = queue.poll();// 每一个出队的结点,都要swap一下swap(node);if(node.left != null) queue.offer(node.left);if(node.right != null) queue.offer(node.right);len--;}   }return root;}public void swap(TreeNode root){TreeNode node = root.left;root.left = root.right;root.right = node;}
}

递归

 class Solution{public TreeNode invertTree(TreeNode root) {if (root == null) return root;// swapChildren(root);// 左孩子的左右孩子交换,右孩子的左右孩子交换invertTree(root.left);invertTree(root.right);// 再交换root的左右孩子swapChildren(root);// 此时,左右孩子的孩子已经交换了,root的左右孩子也交换了,可以返回了return root;}private void swapChildren(TreeNode root) {TreeNode tmp = root.left;root.left = root.right;root.right = tmp;}}

链接力扣101-对称二叉树

思路
1、要比较的是两个节点;

2、两个节点只要某一个为空或者两个值不等,则不对称

3、节点的入队顺序:相比较的节点要挨着入队

左节点的左孩子 右节点的右孩子
左节点的右孩子 右节点的左孩子

非递归

class Solution {public boolean isSymmetric(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();queue.offer(root.left);queue.offer(root.right);while(!queue.isEmpty()){TreeNode leftnode = queue.poll();TreeNode rightnode = queue.poll();// 这里的continue:继续下两个结点的弹出,再进行循环比较if(leftnode == null && rightnode == null) continue;if(leftnode == null || rightnode == null || leftnode.val != rightnode.val){return false;} // 进队顺序://左节点的左孩子====右节点的右孩子// 左节点的右孩子=====右节点的左孩子queue.offer(leftnode.left);queue.offer(rightnode.right);queue.offer(leftnode.right);queue.offer(rightnode.left);}return true;}
}

递归

class Solution {public boolean isSymmetric(TreeNode root){// 1、参数和返回值不需要确认,题目已给出// 2、递归终止条件return symmetric(root.left,root.right);}public boolean symmetric(TreeNode left,TreeNode right){// 终止条件在这里if(right == null && left == null) return true;//这里一个细节:必须先比较是否为空,再比较值if((left == null && right != null) ||(right == null && left != null)||left.val != right.val ) return false;// 两节点的孩子节点比较在这里return symmetric(left.left,right.right) && symmetric(left.right,right.left);}
}

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

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

相关文章

极速查找(2)-算法分析

篇前小言 本篇文章是对查找&#xff08;1&#xff09;的续讲线性索引查找 线性索引查找&#xff08;Linear Index Search&#xff09;是一种基于索引的查找算法。它在数据集合中创建一个索引 结构&#xff0c;然后使用该索引结构来加快对目标元素的查找。 线性索引是一种在数…

Java书签 #解锁MyBatis的4种批量插入方式及ID返回姿势

1. 今日书签 项目开发中&#xff0c;我们经常会用到单条插入和批量插入。但是实际情况可能是&#xff0c;项目初期由于种种原因&#xff0c;在业务各处直接使用单条插入SQL进行开发&#xff08;未开启批处理&#xff09;&#xff0c;在后面的迭代中&#xff0c;系统性能问题渐…

【数据挖掘】如何修复时序分析缺少的日期

一、说明 我撰写本文的目的是通过引导您完成一个示例来帮助您了解 TVF 以及如何使用它们&#xff0c;该示例解决了时间序列分析中常见的缺失日期问题。 我们将介绍&#xff1a; 如何生成日期以填补数据中缺失的空白如何创建 TVF 和参数的使用如何呼叫 TVF我们将考虑扩展我们的日…

字典序排数(力扣)思维 JAVA

给你一个整数 n &#xff0c;按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1&#xff1a; 输入&#xff1a;n 13 输出&#xff1a;[1,10,11,12,13,2,3,4,5,6,7,8,9] 示例 2&#xff1a; 输入&#xff1a;n 2 输…

3.矩阵常用操作

文章目录 线性代数的常用操作1.向量的内积2.向量的外积3.正交向量4.正交向量组5.向量空间的基与维数6.正交矩阵7.反对称矩阵8.齐次坐标与齐次变换矩阵9.相似矩阵10.相似对角化11.矩阵的特征分解12.奇异值分解SVD12.1 SVD求齐次矩阵方程的最小二乘解 13.满秩分解14.Pseudo-Inver…

使用网络 IP 扫描程序的原因

随着网络不断扩展以满足业务需求&#xff0c;高级 IP 扫描已成为网络管理员确保网络可用性和性能的关键任务。在大型网络中扫描 IP 地址可能具有挑战性&#xff0c;这些网络通常包括具有动态 IP、多个 DNS、DHCP 配置和复杂子网的有线和无线设备。使用可提供全面 IP 地址管理 &…

symfony/console

github地址&#xff1a;GitHub - symfony/console: Eases the creation of beautiful and testable command line interfaces 文档地址&#xff1a;The Console Component (Symfony 5.4 Docs) 默认命令list&#xff0c;可以用register注册一个command命令&#xff0c;之后可以…

缺陷推进管理办法

1.测试对缺陷做初步分析定位 测试对缺陷做初步分析定位&#xff0c;减少缺陷流转过程的消耗&#xff0c;如&#xff1a; 客户端测试时可以抓包看一下是接口返回数据有问题&#xff0c;还是客户端有问题 Web前端发现问题&#xff0c;可以F12看一下接口响应、返回信息等&…

面试题汇总——Java异常

异常类(Throwable)的种类 Java异常类(Throwable)可以分为两种: 错误Error:与虚拟机相关的问题,Java 虚拟机无法解决的严重问题;如:StackOverflowError 和 OOM。异常Exception:程序编码错误或外界因素导致等,能被系统捕获并处理; 检查型异常(CheckedException):…

【简单图论】CF1833 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 显然&#xff0c;最大值就是什么边都不连的连通块个数&#xff0c;最小值就是能连的都连上 那就是&#xff0c;如果一个连通块存在度为1的点&#xff0c;就把它当作接口连接 Code&#xff1a; #include <b…

Spring Boot 集成 Redis 三种模式实践汇总

背景 项目的某个模块集成了 SpringBoot Redis 包&#xff0c;客户端使用 Lettuce&#xff0c;Redis 测试环境单机模式。但是现场反馈的 Redis 环境是集群&#xff0c;如果简单的修改 spring.redis 配置为集群的配置信息&#xff0c;程序能否能无缝衔接呢&#xff1f; 本文记录…

音视频——帧内预测

H264编码(帧内预测) 在帧内预测模式中&#xff0c;预测块P是基于已编码重建块和当前块形成的。对亮度像素而言&#xff0c;P块用于44子块或者1616宏块的相关操作。44亮度子块有9种可选预测模式&#xff0c;独立预测每一个44亮度子块&#xff0c;适用于带有大量细节的图像编码&…

HTTPS简介

一、简介与原理 http协议是明文传输的&#xff0c;因此很容易被截取和解析&#xff0c;泄漏个人数据。https协议是在http和tcp之间多添加了一层&#xff0c;进行身份验证和数据加密。 HTTPS 原理 ① 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器 ②…

Gempy三维结构地质建模简明教程

Gempy 是一个开源 Python 库&#xff0c;用于生成完整的 3D 结构地质模型。 该库是一个完整的开发&#xff0c;用于从界面、断层和层方向创建地质模型&#xff0c;它还关联地质层的顺序以表示岩石侵入和断层顺序。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 地质建…

LLaMA2可商用|GPT-4变笨|【2023-0723】【第七期】

一、大咖观点&#xff1a; 傅盛&#xff1a;ChatGPT时代如何创业 - BOTAI - 博客园Google 已经被OpenAI 超越了吗&#xff1f;| AlphaGo 之父深度访谈《人民日报》&#xff1a;大模型的竞争&#xff0c;是国家科技战略的竞争WAIC 2023 | 张俊林&#xff1a;大语言模型带来的交…

Node.js:execSync执行一个shell命令

默认输出是Buffer对象 const { execSync } require(child_process)let out execSync("echo hi") console.log(out); // <Buffer 68 69 0a>需要转为字符串 const { execSync } require(child_process)let out execSync("echo hi") console.log(…

设计模式之状态模式

状态决定行为。由于状态在运行期间是可以被改变的。在VoteManager类中根据条件来创建不同的状态实现类&#xff0c;于是到最后就会调用不同的逻辑。 看起来同一个对象&#xff0c;在不同的运行时刻&#xff0c;行为是不一样的&#xff0c;就像是类被修改了一样&#xff01; 场…

labview 信号量实现互斥 避免竞争写

上一篇文章中描述了事件发生、集合点、通知器、信号量。 本文进一步举例描述信号量实现互斥&#xff0c;避免竞争写。 1.不用信号量的例子 图1-不用信号量的结果都不同&#xff0c;不为0 图2-不用信号量的例子&#xff0c;程序框图 2.用信号量的例子 图3-用信号量的例子&…

结构型设计模式之亨元模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

Unity中使用CSV文件作为关卡数据

要在Unity中使用CSV文件作为关卡数据&#xff0c;并在通关后导入下一关的CSV文件数据&#xff0c;你可以按照以下步骤进行操作&#xff1a; 创建一个空的游戏对象&#xff0c;将其命名为"LevelManager"。 在"LevelManager"对象上创建一个C#脚本&#xff0…