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

层序遍历

我们是用队列来保存元素。同时记录队列的大小,用来表示一层有几个节点。从而实现分层进行操作

遍历每一层(每一层遍历size次)的同时,把它的左右孩子都入队(插入队尾)(如果有的话)。

  • java代码
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        Deque<TreeNode> queue = new ArrayDeque<>();  //初始化队列
        if(root == null) return res;
        queue.push(root);

        while(!queue.isEmpty()) {
            List<Integer> floor = new ArrayList<>();  //存放每一层的结果
            int len = queue.size();
            for(int i = 0; i < len; i++) {  //对每一层进行操作
                TreeNode tmp = queue.pop();  //取出队头,加入结果数组同时将左右孩子入队(插入队尾用offer)
                floor.add(tmp.val);
                if(tmp.left != null) queue.offer(tmp.left);
                if(tmp.right != null) queue.offer(tmp.right);
            }
            //每一层遍历完后添加一次floor数组
            res.add(floor);
        }
        return res;
    }
}

107.二叉树的层次遍历 II

直接Collections.reverse(res);就行

199.二叉树的右视图

题目是一维数组,在每层的for循环里加一个判断,if(i == len-1) 才加到答案数组里。

637.二叉树的层平均值

每层用sum累加,在每层的for循环里加一个判断,if(i == len-1) 才把sum/len加到答案数组里。

429.N叉树的层序遍历

注意要改变添加每层的孩子节点的逻辑!

List<Node> children = tmp.children;   //先把孩子结点list取出来
if (children == null || children.size() == 0) {  //如果没有孩子了就跳过这次循环
	continue;
}
for (Node child : children) {  //遍历孩子结点list 不为空就加到队列里
	if (child != null) {
		queue.offer(child);
	}
}

515.在每个树行中找最大值

在每次进while(相当于处理下一层)的时候,初始化max=Integer.MIN_VALUE,然后在for循环里max=Math.max(max,node.val)

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

在单层遍历的时候记录一下本层的头部节点(先取出,然后把左右孩子入队一次),然后在遍历的时候让前一个节点指向本节点就行(size-1次)

104.二叉树的最大深度

遍历每一层的同时depth++

111.二叉树的最小深度

只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点。只要遇到了就直接返回depth即可

226. 翻转二叉树

想要翻转它,其实把每一个节点的左右孩子交换一下就可以了。

那我们采用什么方式遍历呢?前 后 层序都可以,唯独中序不行!(其实也可以,只要修改一下right成left就行)中序反转左子树后,回到根节点,此时的右子树实际上是原来的左子树!

在这里插入图片描述

递归三部曲

  1. 确定递归函数的参数和返回值

参数就是要传入节点的指针,不需要返回值

void reverse(TreeNode root)
  1. 确定终止条件

当前节点为空的时候,就返回

if (root == NULL) return root;
  1. 确定单层递归的逻辑

先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。

swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);

注意swap函数要写成swap(TreeNode root)!不能直接交换left和right

  • java代码(前序)
class Solution {
    public void reverse(TreeNode root) {
        if(root == null) return;
        swap(root);
        reverse(root.left);
        reverse(root.right);
    }

    public void swap(TreeNode root) {
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
    }

    public TreeNode invertTree(TreeNode root) {
        reverse(root);
        return root;
    }
}

101.对称二叉树

我们判断是否对称,实际是判断根节点的左子树和右子树是否可以相互翻转。同为内侧节点两两比较,同为外侧节点两两比较。

确定遍历顺序

这题==只能用后序!==因为我们要不断收集左右孩子的信息,然后返回给上一个节点(上一层)。我才能知道左节点为根的树和 右节点为根的树 是否是相互反转的。

后序:左 右 中

在这里插入图片描述

代码实现

  1. 确定递归函数的返回值和参数
bool compare(TreeNode left, TreeNode right)
  1. 确定终止条件

左为空 && 右不为空 false

左不为空 && 右为空 false

左为空 && 右为空 true

左右都不为空 && 值不相等 false

左右都不为空 && 值相等 true

  1. 单次递归逻辑

分别判断左右侧 孩子是否都对称相等!(这个结果最终会传回来,一直传到根节点)

boolean outside = compare(left.left, right.right);  //左
boolean inside = compare(left.right, right.left);  //右
boolean result = inside && outside;  //中
  • java代码
class Solution {
    //后序遍历 左右中
    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) return true;
        else if(left.val != right.val) return false;
        boolean outside = compare(left.left, right.right); //左
        boolean inside = compare(left.right, right.left); //左
        boolean result = outside && inside; //中
        return result;
    }

    public boolean isSymmetric(TreeNode root) {
        return compare(root.left,root.right);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++类和对象详解(上)

类的引入 由于内容十分之多所以类和对象我将分成三期去讲解 在C语言中&#xff0c;描绘一类对象的的属性时&#xff0c;我们会使用结构体&#xff0c;在结构体重定义该对象的特征&#xff0c;如一个学生。 struct student { char name[20]; int age; char sex[10]; //... };而…

Maven介绍

1.什么是Maven Maven是一个针对Java项目的构建和依赖管理工具。 具体来说&#xff0c;Maven 提供了一系列用于项目管理的功能&#xff0c;包括但不限于&#xff1a; 依赖管理&#xff1a;通过pom.xml文件&#xff0c;Maven 可以自动处理项目所需的所有依赖库&#xff0c;简化…

基于Vue.js和D3.js的智能停车可视化系统

引言 随着物联网技术的发展&#xff0c;智能停车系统正逐渐普及。前端作为用户交互的主要界面&#xff0c;对于提供直观、实时的停车信息至关重要。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 首先&#xff0c;确保您的开发环境已经安装了Node.js和npm。然后&…

华为综合案例-普通WLAN全覆盖配置(2)

组网图 结果验证 在AC_1和AC_2上执行display ap all命令&#xff0c;检查当前AP的状态&#xff0c;显示以下信息表示AP上线成功。[AC_1] display ap all Total AP information: nor : normal [1] ExtraInfo : Extra information P : insufficient power supply ---…

Naocs-config配置中心知识点

1、配置中心特点 方便维护&#xff0c;时效性&#xff0c;安全性。 只要更改了配置文件&#xff0c;微服务可以在极短的时间内更新配置并应用。 2、配置文件命名规则 2.1DataID {spring.application.name}-{spring.profile.active}.{spring.cloud.nacos.config.file-extens…

数据仓库相关概述

数据仓库概述 数据仓库概念 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据&#xff0c;借助数据仓库的分析能力&#xff0c;企业可从数据中获得宝贵的信息进而改进决策。同时&#xff0c;随着时间的推移&#xff0c;数据仓…

【计算机视觉】三、图像处理——实验:图像去模糊和去噪、提取边缘特征

文章目录 0. 实验环境1. 理论基础1.1 滤波器&#xff08;卷积核&#xff09;1.2 PyTorch:卷积操作 2. 图像处理2.1 图像读取2.2 查看通道2.3 图像处理 3. 图像去模糊4. 图像去噪4.1 添加随机噪点4.2 图像去噪 0. 实验环境 本实验使用了PyTorch深度学习框架&#xff0c;相关操作…

企业工商年报注册注销商标注册异常处理小程序开源版开发

企业工商年报注册注销商标注册异常处理小程序开源版开发 1、独立业务模型包括&#xff1a;企业工商年报、企业工商登记注册、企业注销登记、企业异常处理。 2、通用业务模型适合各种业务&#xff0c;比如&#xff1a;商标注册代理、财务会计服务、企业版权登记登。 当然&…

基于nodejs+vue天气数据可视化平台python-flask-django-php

随着社会多元化的不断发展&#xff0c;天气数据问题不可被简单的理解为是科学问题&#xff0c;更多的是环境问题&#xff0c;可以直接影响到人民的日常生活&#xff0c;甚至对一个国家的政治经济带来影响&#xff0c;由此可见&#xff0c;天气预测是一项非常重要的行业。基于此…

C++总结

数据类型 基本的内置类型 修饰符类型 C 允许在 char、int 和 double 数据类型前放置修饰符。 修饰符是用于改变变量类型的行为的关键字&#xff0c;它更能满足各种情境的需求。 类型限定符 函数 以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的&am…

MacOS 电脑如何通过自带terminal终端连接PostgreSQL

1、安装Postgre SQL客户端工具 brew install postgresql 2、连接到PostgreSQL &#xff08;1&#xff09;创建远程连接 psql -h hostname -U username -d database 其中&#xff0c;hostname 是 PostgreSQL 服务器的主机名或 IP 地址&#xff0c;username 是您的 PostgreS…

kubesphere all in one部署Jenkins提示1 Insufficient cpu

原因 devops 至少一个cpu&#xff08;1000m&#xff09;&#xff0c;但是其他资源已经占用了很多cpu CPU 资源以 CPU 单位度量。Kubernetes 中的一个 CPU 等同于&#xff1a; 1 个 AWS vCPU 1 个 GCP核心 1 个 Azure vCore 裸机上具有超线程能力的英特尔处理器上的 1 个超线程…

一款不错的开源的 Linux 服务器运维管理面板:1Panel

适用于非运维人员的环境搭建、部署、监控等 一、1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括&#xff1a; 快速建站&#xff1a;深度集成 Wordpress 和 Halo&#xff0c;域名绑定、SSL 证书配置等一键搞定&#xff1b; 高效管理&#xf…

【RPG Maker MV 仿新仙剑 战斗场景UI (五)】

RPG Maker MV 仿新仙剑 战斗场景UI 五 战斗状态菜单原始RMMV 菜单窗口仿新仙剑代码仿新仙剑战斗状态菜单 战斗状态菜单 这部分比较简单&#xff0c;由于有主菜单的状态菜单打底所以开发上也容易些。 原始RMMV 菜单窗口 在原版的RMMV中显示的数据主要是人物的HP、MP、TP、和两…

1688货源工厂商品采集如何实现自动化对接?(API免费测试)

随着电子商务的迅猛发展&#xff0c;货源采购已成为企业运营中不可或缺的一环。对于许多商家而言&#xff0c;1688货源工厂是一个重要的采购平台&#xff0c;其丰富的商品种类和价格优势吸引了大量采购者的目光。然而&#xff0c;手动采集商品信息不仅效率低下&#xff0c;而且…

SpringCloudAlibaba Nacos配置及应用

Nacos搭建及配置 nacos本机服务搭建 windows上搭建单机nacos&#xff1a; Releases alibaba/nacos GitHub 下载安装包 下载本地&#xff0c;解压&#xff0c;直接运行&#xff08;保证安装包的绝度路径只有英文字符&#xff0c;有中文会导致运行失败&#xff09;&#xff…

进程切换进程状态

文章目录 前言一、进程切换二、运行状态(R)三、休眠状态(S)四、磁盘休眠状态(D)五、停止状态(T)六、死亡状态(X)和僵尸状态(Z) 前言 人在做一件事情都会有对应的状态是做完了&#xff0c;还是没有开始做或者正在做&#xff0c;而进程也是有自己状态的进程对应状态&#xff1a;…

ReaLTaiizor开源.NET winform控件库学习使用

一、ReaLTaiizor项目介绍 1.1 介绍及地址 基于MIT license开源、免费、美观的.NET WinForm UI控件库&#xff1a;ReaLTaiizor ReaLTaiizor是一个开源免费的.NET WinForms控件库&#xff0c;它提供了广泛的组件和丰富的主题选项&#xff08;用户友好、注重设计&#xff09;&am…

Spring boot2.7整合jetcache方法缓存 处理数据发生变化时同步更新缓存 删除缓存操作

上文 Spring boot2.7整合jetcache方法缓存 我们做了个方法缓存的案例 可以将接口内容缓存起来 是能大大提高效率的 但是 我们接口的数据大多来自数据库 如果我们调用增删查改 它的数据变化了 那缓存的内容就会因为没有及时更新变的不准确 例如 我们这样 我们在上面 定义了 一…

微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现)

项目介绍 自从计算机发展开始&#xff0c;计算机软硬件相关技术的发展速度越来越快&#xff0c;在信息化高速发展的今天&#xff0c;计算机应用技术似乎已经应用到了各个领域。 在餐饮行业&#xff0c;除了外卖以外就是到店里就餐&#xff0c;在店里就餐如果需要等待点餐的话…