day15|各种遍历的应用

相关题目:
层次遍历会一打十
反转二叉树
对称二叉树

层次遍历会一打十

自底向上的层序遍历

在这里插入图片描述
实现思路:层次遍历二叉树,将遍历后的结果revers即可

public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> res = new ArrayList<>();Queue<TreeNode> que = new ArrayDeque<>();if (root == null) {return res;}que.offer(root);int size = 0;while (!que.isEmpty()) {size = que.size();List<Integer> list = new ArrayList<>();while (size > 0) {TreeNode cur = que.poll();list.add(cur.val);if (cur.left != null) {que.offer(cur.left);}if (cur.right != null) {que.offer(cur.right);}size--;}res.add(list);}Collections.reverse(res);return res;}

输出二叉树的右视图节点

在这里插入图片描述
实现思路:层次遍历二叉树,记录二叉树每一层的节点数,到达该层最后一个节点时,将其加入到结果集即可

public List<Integer> rightSideView(TreeNode root) {List<Integer> res = new ArrayList<>();if(root == null){return res;}Queue<TreeNode> que = new ArrayDeque<>();que.offer(root);int size = 0;while(!que.isEmpty()){size = que.size();while(size>0){TreeNode cur = que.poll();//遍历到该层最后一个节点if(size == 1){res.add(cur.val);}if(cur.left!=null){que.offer(cur.left);}if(cur.right!=null){que.offer(cur.right);}size--;}}return res;}

二叉树每层的平均值

在这里插入图片描述
实现思路:层次遍历二叉树,计算每一层的平均值,注意:每层数之和及平均值的数据类型

public List<Double> averageOfLevels(TreeNode root) {List<Double> res = new ArrayList<>();Queue<TreeNode> que = new ArrayDeque<>();if(root == null){return res;}int size = 0;que.offer(root);while(!que.isEmpty()){size = que.size();double sum = 0;for (int i = 0; i < size; i++) {TreeNode cur = que.poll();sum += cur.val;if(cur.left!=null){que.offer(cur.left);}if(cur.right!=null){que.offer(cur.right);}}res.add(sum/size);}return res;}

N叉树的·层次遍历

在这里插入图片描述

class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};public class LevelOrderNode {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> res = new ArrayList<>();if (root == null) {return res;}Queue<Node> que = new ArrayDeque<>();que.offer(root);while (!que.isEmpty()) {int size = que.size();List<Integer> list = new ArrayList<>();for (int i = 0; i < size; i++) {Node cur = que.poll();list.add(cur.val);List<Node> children = cur.children;if (children == null || children.size() == 0) {continue;}for (Node child : children) {if (child != null) {que.offer(child);}}}res.add(list);}return res;}}

在二叉树的每一行中找最大值

在这里插入图片描述
实现思路:层次遍历二叉树,记录每一层的最大值

public List<Integer> largestValues(TreeNode root) {List<Integer> res = new ArrayList<>();if(root == null){return res;}Queue<TreeNode> que = new ArrayDeque<>();int size = 0;que.offer(root);while(!que.isEmpty()){size = que.size();int max = Integer.MIN_VALUE;while(size>0) {TreeNode cur = que.poll();max = Math.max(max,cur.val);if(cur.left!=null){que.offer(cur.left);}if(cur.right!=null){que.offer(cur.right);}size--;}res.add(max);}return res;}

填充每个节点的下一个右侧节点指针

在这里插入图片描述
实现思路:层次遍历二叉树,记录每层元素个数,遍历每层元素,元素个数大于1时,使其next指针指向队头元素;元素个数为1时,使其next指针指向null即可

class NodeText {public int val;public NodeText left;public NodeText right;public NodeText next;public NodeText() {}public NodeText(int _val) {val = _val;}public NodeText(int _val, NodeText _left, NodeText _right, NodeText _next) {val = _val;left = _left;right = _right;next = _next;}
};
public class Connect {public NodeText connect(NodeText root) {Queue<NodeText> que = new ArrayDeque<>();if(root == null){return root;}que.offer(root);while(!que.isEmpty()){int size = que.size();while(size>0){NodeText cur = que.poll();if(size>1){NodeText temp = que.peek();cur.next = temp;}else{cur.next =null;}if(cur.left!=null){que.offer(cur.left);}if(cur.right!=null){que.offer(cur.right);}size--;}}return root;}
}

求二叉树的最大深度

在这里插入图片描述
实现思路:层次遍历二叉树,记录树的层数

public int maxDepth(TreeNode root) {int maxDepth = 0;int size = 0;if(root == null){return 0;}Queue<TreeNode> que = new ArrayDeque<>();que.offer(root);while(!que.isEmpty()){maxDepth++;size = que.size();while(size>0){TreeNode cur = que.poll();if(cur.left!=null){que.offer(cur.left);}if(cur.right!=null){que.offer(cur.right);}size--;}}return maxDepth;}

求二叉树的最小深度

在这里插入图片描述

实现思路:层次遍历二叉树,当某个节点的左右孩子均为null时,输出该节点所在层数,及就是树的最小深度

public int minDepth(TreeNode root) {if (root == null) {return 0;}int deep = 0;int size = 0;Queue<TreeNode> que = new ArrayDeque<>();que.offer(root);while (!que.isEmpty()) {deep++;size = que.size();while (size > 0) {TreeNode cur = que.poll();if (cur.left == null && cur.right == null) {return deep;} else {if (cur.left != null) {que.offer(cur.left);}if (cur.right != null) {que.offer(cur.right);}}size--;}}return deep;}

反转二叉树(掌握递归遍历)

实现方法:使用前序遍历、后序遍历及其层次遍历均可实现
前序遍历实现方法:遍历中间节点,中间节点的左右孩子交换位置即可
后序遍历实现方法:遍历的左子树和右子树,交换中间节点左右孩子交换位置即可
层次遍历:遍历每一层的各个节点,反转各个节点的左右孩子即可

public class InvertTree extends TreeNode {public TreeNode invertTree(TreeNode root) {if(root == null){return null;}
//        //前序
//        swap(root);
//        invertTree(root.left);
//        invertTree(root.right);//        //后序
//        invertTree(root.left);
//        invertTree(root.right);
//        swap(root);//层次遍历--迭代Queue<TreeNode> que = new ArrayDeque<>();int size = 0;que.offer(root);while(!que.isEmpty()){size = que.size();while(size>0){TreeNode cur = que.poll();swap(cur);if(cur.left!=null){que.offer(cur.left);}if(cur.right!=null){que.offer(cur.right);}size--;}}return root;}public void swap(TreeNode root){TreeNode temp = root.left;root.left = root.right;root.right = temp;}
}

对称二叉树

递归实现:
递归三部曲

  1. 确定递归函数的参数和返回值
    因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。
    返回值自然是bool类型。
    代码如下:
    bool compare(TreeNode* left, TreeNode* right)
  2. 确定终止条件
    要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。
    节点为空的情况有:(注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点)
  • 左节点为空,右节点不为空,不对称,return false
  • 左不为空,右为空,不对称 return false
  • 左右都为空,对称,返回true
  • 左右都不为空,比较节点数值,不相同就return false
    代码如下:
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; // 注意这里我没有使用else

注意上面最后一种情况,我没有使用else,而是else if, 因为我们把以上情况都排除之后,剩下的就是 左右节点都不为空,且数值相同的情况。
3. 确定单层递归的逻辑
此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。

  • 比较二叉树外侧是否对称 :传入的是左节点的左孩子,右节点的右孩子。
  • 比较内侧是否对称:传入左节点的右孩子,右节点的左孩子。

如果左右都对称就返回true ,有一侧不对称就返回false 。
实现过程:

class Solution {public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}return compare(root.left,root.right);}//递归实现public boolean 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 && left.val != right.val) return false;else if (left == null && right == null) return true;boolean inside = compare(left.left, right.right);boolean outside = compare(left.right, right.left);return inside && outside;}
}

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

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

相关文章

框架学习之SpringMVC学习笔记(一)

一、SpringMVC简介 1-介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08; spring-webmvc &#xff09;&#xff0c;但它通常被称为“Spring MVC”。 在控制层…

一文深度剖析 ColBERT

近年来&#xff0c;向量搜索领域经历了爆炸性增长&#xff0c;尤其是在大型语言模型&#xff08;LLMs&#xff09;问世后。学术界开始重点关注如何通过扩展训练数据、采用先进的训练方法和新的架构等方法来增强 embedding 向量模型。 在之前的文章中&#xff0c;我们已经深入探…

记录踩坑事件 分页查询order by出现重复数据bug

MySQL排序小坑_mysql order by name相同导致排序混乱-CSDN博客 1、问题描述 列表页分页查询出现重复数据。 2、问题排查 排查最终执行sql日志。 select * from tableA where (start_time>2024-04-17 00:00:00) AND (start_time<2024-05-18 00:00:00) ORDER BY sta…

AIGC基础教学:AI+建筑设计,一场划时代变革的序幕已经拉开

2015年9月&#xff0c;美的集团本着把艺术融入民间的理念&#xff0c;邀请了安藤忠雄设计正在筹建中的美术馆。 在历经长达近120天的设计工作之后&#xff0c;美术馆于同年12月动工。这座具有岭南建筑文化意境的美术馆&#xff0c;后来荣获2020年美国建筑大师奖(Architecture …

【ArcGIS微课1000例】0112:沿线(面)按距离或百分比生成点

文章目录 一、沿线生成点工具介绍二、线状案例三、面状案例一、沿线生成点工具介绍 位置:工具箱→数据管理工具→采样→沿线生成点 摘要:沿线或面以固定间隔或百分比创建点要素。 用法:输入要素的属性将保留在输出要素类中。向输出要素类添加新字段 ORIG_FID,并设置为输…

Java.lang.InterruptedException被中止异常解决方案

大家好&#xff01;我是咕噜铁蛋&#xff01;在Java编程的世界里&#xff0c;java.lang.InterruptedException是一个常见的异常&#xff0c;尤其是在处理多线程和并发任务时。这个异常通常表示一个线程在等待、休眠或其他占用时间不长的操作时被中断。作为一个资深的Java开发者…

Navicat 连接 OceanBase 快速入门 | 社区版

Navicat Premium&#xff08;16.1.9或更高版本&#xff09;正式支持 OceanBase全线数据库产品。OceanBase为现代数据架构打造的开源分布式数据库。兼容 MySQL 的单机分布式一体化国产开源数据库&#xff0c;具有原生分布式架构&#xff0c;支持金融级高可用、透明水平扩展、分布…

CCF CAT- 全国算法精英大赛(2024第二场)往届真题练习 2 | 珂学家

前言 这是第二场CCF的练习赛&#xff0c;找找手感&#xff0c;顺便熟悉下赛氪OJ平台。 当前就做了5题&#xff0c;感觉还可以&#xff0c;部分题目质量蛮高的&#xff0c;但是易错。 第1题dp入门题&#xff0c; 第5属于诈骗题&#xff0c;第2和第3挺有难度的&#xff0c;第四…

【杂七杂八】Huawei Gt runner手表系统降级

文章目录 Step1&#xff1a;下载安装修改版华为运动与健康Step2&#xff1a;在APP里进行配置Step3&#xff1a;更新固件(时间会很长) 目前在使用用鸿蒙4 111版本的手表系统&#xff0c;但是感觉睡眠检测和运动心率检测一言难尽&#xff0c;于是想到是否能回退到以前的版本&…

设计模式14——组合模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 组合模式&#xff08;Composit…

LeetCode199二叉树的右视图

题目描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 解析 这一题的关键其实就是找到怎么去得到当前是哪一层级&#xff0c;可以利用队列对二叉树进行层次遍历&#xff0c;但…

ICRA 2024: NVIDIA 联合多伦多大学、加州大学伯克利分校、苏黎世联邦理工学院等研究人员开发了精细操作的手术机器人

英伟达&#xff08;NVIDIA&#xff09;正与学术研究人员合作&#xff0c;研究手术机器人。 NVIDIA 联合多伦多大学、加州大学伯克利分校、苏黎世联邦理工学院和佐治亚理工学院的研究人员开发了 ORBIT-Surgical&#xff0c;一个训练机器人的模拟框架&#xff0c;可以提高手术团…

vue3的api风格

Vue的组件有两种不同的风格&#xff1a;组合式API 和 选项式API 选项式api 选项式API&#xff0c;可以用包含多个选项的对象来描述组件的逻辑&#xff0c;如&#xff1a;data&#xff0c;methods&#xff0c;mounted等。 组合式api setup&#xff1a;是一个标识&#xff0c;告…

图像上下文学习|多模态基础模型中的多镜头情境学习

【原文】众所周知&#xff0c;大型语言模型在小样本上下文学习&#xff08;ICL&#xff09;方面非常有效。多模态基础模型的最新进展实现了前所未有的长上下文窗口&#xff0c;为探索其执行 ICL 的能力提供了机会&#xff0c;并提供了更多演示示例。在这项工作中&#xff0c;我…

Docker简单使用

1.简单认识 软件的打包技术&#xff0c;就是将打乱的多个文件打包为一个整体&#xff0c;比如想使用nginx&#xff0c;需要先有一台linux的虚拟机&#xff0c;然后在虚拟机上安装nginx.比如虚拟机大小1G&#xff0c;nginx100M。当有了docker后我们可以下载nginx 的镜像文件&am…

【openlayers系统学习】1.6下载要素,将要素数据序列化为 GeoJSON并下载

六、下载要素 下载要素 上传数据并编辑后&#xff0c;我们想让用户下载结果。为此&#xff0c;我们将要素数据序列化为 GeoJSON&#xff0c;并创建一个带有 download​ 属性的 <a>​ 元素&#xff0c;该属性会触发浏览器的文件保存对话框。同时&#xff0c;我们将在地图…

Linux--07---查看CPU、内存、磁盘

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 常用命令1.查看CPU使用率1.1 top 命令第一行是任务队列信息&#xff1a; top第二行为进程的信息 Tasks第三行为CPU的信息Mem:Swap 1.2 vmstat命令参数详解每个参数的…

CentOS部署NFS

NFS服务端 部署NFS服务端 sudo yum install -y nfs-utils挂载目录 给 NFS 指定一个存储位置&#xff0c;也就是网络共享目录。一般来说&#xff0c;应该建立一个专门的 /data 目录&#xff0c;方便起见使用临时目录 /tmp/nfs&#xff1a; mkdir -p /tmp/nfs #修改权限 chmo…

响应式处理-一篇打尽

纯pc端响应式 pc端平常用到的响应式布局 大致就如下三种&#xff0c;当然也会有其他方法&#xff0c;欢迎评论区补充 将div height、width设置成100% flex布局 flex布局主要是将flex-wrap: wrap&#xff0c; 最后&#xff0c;你可以通过给子元素设置 flex 属性来控制它们的…

Leecode热题100---45:跳跃游戏②

题目&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。 返回到达 nums[n - 1] 的最小跳跃次数。 思路&#xff1a; 如果某一个作为 起跳点 的格子可以跳跃的距离是 3&#xff0c;那么表示后面…