代码随想录-46-226.翻转二叉树

news2025/1/11 16:01:18

目录

  • 前言
    • 题目
  • 1.使用队列
      • 思路(定义变量)
    • 2. 本题思路分析:
    • 3. 算法实现
    • 4. pop函数的算法复杂度
    • 5. 算法坑点

前言

在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。
代码随想录此题链接

题目

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 1:
在这里插入图片描述
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
示例 2:
在这里插入图片描述
输入:root = [2,1,3]
输出:[2,3,1]
示例 3:

输入:root = []
输出:[]

提示:

树中节点数目范围在 [0, 100] 内
-100 <= Node.val <= 100

1.使用队列

思路(定义变量)

  • 有三种方式,递归、深度优先遍历的迭代、广度优先遍历。
    遍历每个节点,更换当前节点的左右孩子。

2. 本题思路分析:

广度优先遍历全部的节点,然后之前记录节点值的操作改换成更换当前节点的左右孩子操作即可

3. 算法实现

  • 代码:
    递归:
public TreeNode invertTree(TreeNode root) {
    if(root == null) return null;
    swap(root);
    invertTree(root.left);
    invertTree(root.right);
    return root;
}
public void swap(TreeNode cur){
    TreeNode tmp = cur.left;
    cur.left = cur.right;
    cur.right = tmp;
}

深度优先遍历:
(前序,非统一迭代法)

public TreeNode invertTree(TreeNode root) {
    if(root == null) return null;
    Deque<TreeNode> stack = new ArrayDeque<>();
    stack.push(root);
    while(!stack.isEmpty()){
        TreeNode cur = stack.pop();
        if(cur.left != null){
            stack.push(cur.left);
        }
        if(cur.right != null){
            stack.push(cur.right);
        }
    }
    
    
    return root;
}

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

(后序,统一迭代法)
ArrayDeque中不能加入null,所以通过Stack实现栈,而不是ArrayDeque

public TreeNode invertTree(TreeNode root) {
    if(root == null) return null;
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while(!stack.isEmpty()){
        TreeNode cur = stack.pop();
        if(cur != null){
            stack.push(cur);
            stack.push(null);
            if(cur.right != null){stack.push(cur.right);} 
            if(cur.left != null){stack.push(cur.left);} 
        }else{
            cur = stack.pop();
            swap(cur);
        }
    }
    return root;
}

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

广度优先遍历解法:

public TreeNode invertTree(TreeNode root) {
   Deque<TreeNode> queue = new ArrayDeque<>();
    if(root == null) return null;
    queue.offer(root);
    while(!queue.isEmpty()){
        int size = queue.size();
        for(int i = 0;i < size;i++){
            TreeNode cur = queue.remove();
            swap(cur);
            if(cur.left != null){
                queue.offer(cur.left);
            }
            if(cur.right != null){
                queue.offer(cur.right);
            }
        }
    }
    return root;
}

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

4. pop函数的算法复杂度

5. 算法坑点

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

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

相关文章

浅谈一下个人基于IRIS后端业务开发框架的理解

文章目录浅谈一下个人基于IRIS后端业务开发框架的理解现状方案具体实现BaseBizDataFilterSqlImp、RefApiUtil总结浅谈一下个人基于IRIS后端业务开发框架的理解现状由于国内使用基于M语言IRIS平台几乎都在医疗行业。医疗系统又非常的庞大和复杂。前期由于快速占领市场&#xff0…

珠城科技在创业板上市:IPO首日跌破发行价,市值相对蒸发约7亿元

12月26日&#xff0c;浙江珠城科技股份有限公司&#xff08;下称“珠城科技”&#xff0c;SZ:301280&#xff09;在深圳证券交易所创业板上市。本次上市&#xff0c;珠城科技的发行价格为67.40元/股&#xff0c;发行数量为1628.34万股&#xff0c;募资总额约为10.98亿元&#x…

java线程

1.创建线程和运行线程 1.1.方式一: 直接使用Thread线程对象创建线程 Slf4j public class TestThread {public static void main(String[] args) {//创建一个线程,并且指定线程名称为"t1"Thread thread new Thread("t1") {Overridepublic void run() {//…

基于JAVA springboot + MYSQL +VUE的项目管理系统(含数据库),包括工时统计、原型预览、效果图管理等

平台介绍 无鱼工时管理系统&#xff0c;是一款轻量级工时记录和管理工具&#xff0c;包括项目管理&#xff0c;工时上报&#xff0c;工时日报&#xff0c;工时统计等功能。 无鱼工时管理系统可通过员工工时上报的方式&#xff0c;来记录项目所花费的工时&#xff0c;帮助企业…

滑块验证 - 使用AJ-Captcha插件【超简单.jpg】

滑块验证实现一、后端1&#xff09;首先引入maven&#xff1a;2&#xff09;再在application.yml中自定义水印&#xff0c;直接启动后前端就可以请求接口了3&#xff09;重写CaptchaCacheServiceRedisImpl①先新建一个文件夹②重写impl二、前端&#xff1a;1&#xff09;复制文…

UML2面向对象分析与设计(第2版) 谭火彬 杂记

首先&#xff0c;来讲讲我对泛化的理解&#xff0c;其实这是站在的视角的不同而表述的不同&#xff0c;泛化是站在父类的角度&#xff0c;父类给孩子的方式叫泛化&#xff0c;而继承是站在孩子的角度&#xff0c;儿子继承父类的方式叫继承。 其实上了谭老师大概一章的课程&…

使用WebPageTest、Lighthouse和Chrome DevTools评估网站性能

目录 一&#xff1a;使用WebPageTest评估网站性能 二&#xff1a;使用Lighthouse分析性能 1、本地npm安装Lighthouse 2、Chrome DevTools中使用 三&#xff1a;使用Chrome DevTools分析性能 一&#xff1a;使用WebPageTest评估网站性能 进入网站首页WebPageTest - Websit…

Linux下常用基本指令大全

在XShell下的复制粘贴 复制: ctrl insert (有些insert 需要配合fn 来按) 粘贴: shift insert ctrl c / ctrl v 是不行的.1. ls指令 语法&#xff1a;ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0…

从App Lab就一鸣惊人的Gorilla Tag,创始人竟是个电竞选手

前不久&#xff0c;热门VR游戏《Gorilla Tag》登陆Quest正式商店&#xff0c;此前该作已经进入App Lab和SteamVR平台&#xff0c;一度成为App Lab最受欢迎的游戏&#xff0c;至此终于修成正果。截至目前&#xff0c;该作在全平台的下载量高达500万次&#xff0c;在Quest商店累计…

七、Java 14 新特性

七、Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布&#xff0c;此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新&#xff0c;即便在全球疫情如此严峻形势下&#xff0c;依然保持每六个月的版本更新频率&#xff0c;为大家及时带来改进和增强&…

覆盖和覆盖D2D通信网络的传输容量分析(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 移动数据流量的日益增长与有限的频谱资源之间的矛盾催生了用以提升频谱空间利用率的设备到设备&#xff08;Device-to-Device,…

Typora配置github图床踩坑记录:“success“:false,“message“:“upload error

今天在给typora配置图床的时候遇到了一丢丢问题 我是根据这位大佬的配置步骤使用GithubpicGo搭建图床&#xff0c;保姆级教程来了一步步来的&#xff0c;在处理typora验证图片上传选项时遇到问题&#xff1a; {“success”:false,“message”:“upload error. see C:\Users\AS…

【JavaScript】时间对象

基础知识&#xff1a; 获取年月日&#xff0c;时间&#xff1a; var datenew Date();console.log(date);Thu Nov 17 2022 10:15:07 GMT0800 (中国标准时间) 实际上是对象&#xff0c;但是自动转为字符串显示了。 // 传递参数进去 var date1new Date("2022/11/25 14:38…

录屏软件哪个好?五款免费视频录屏软件

现如今在日常生活中都可以使用得上录屏软件&#xff0c;比如线上会议直播、线上教程课程、网课直播、玩游戏精彩瞬间等等&#xff1b;在互联网众多推荐下&#xff0c;到底录屏软件哪个好&#xff1f;今天小编在这里给大家分享五款免费视频录屏软件&#xff0c;有需要的朋友可以…

个人的一些小创作(随便玩玩,由于技术限制,无使用价值)

tips 1. 桶排序算法的话&#xff0c;必须会去重&#xff0c;因为它的核心就是把数值与数组的下标对应起来&#xff0c;那如果你有多个相同的数值&#xff0c;那也只能对应同一个数组的下标。然后桶排序算法最后打印的是数组的下标&#xff0c;而不是数组下标对应元素的值。 2…

wps合并多个pdf,四个步骤轻松解决

wps这个软件相信大家都或多或少使用过。很多人日常触及到wps的功能&#xff0c;一般是word、Excel或者PPT这三种。其实wps也可以用来读取、编辑PDF文档。wps编辑PDF文档需要一定的技巧&#xff0c;比如使用wps合并多个pdf的方法&#xff0c;很多网友都在问。这里给大家做一个详…

10、SpringCloud 系列:Nacos - 注册中心

SpringCloud 系列列表&#xff1a; 文章名文章地址01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/12831902302、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/12833228803、OpenFeign - 远程调用https://blog.csdn.…

41. 使用块的网络(VGG)代码实现

1. VGG块 在下面的代码中&#xff0c;我们定义了一个名为vgg_block的函数来实现一个VGG块。 该函数有三个参数&#xff0c;分别对应于卷积层的数量num_convs、输入通道的数量in_channels 和输出通道的数量out_channels. import torch from torch import nn from d2l import …

【玩转c++】c++ :string类讲解(万字详解)

目录 &#x1f341;1. 为什么要学习string类 &#x1f341;2. 标准库中的string类 &#x1f341;3. string类各种接口 默认成员函数 Iterators迭代器 capacity容量 Element access:元素访问 Modifiers:修改 字符串操作 成员变量 非成员函数 &#x1f341;4. 扩展阅读 本期主题…

stm32f407VET6 系统学习 day07 通用定时器, OLED 屏幕使用 PWM 的使用

1. 通用定时器的知识 1.STM32共有14个定时器&#xff0c;其中12个16位定时器&#xff0c;2个32 位定时器 2. 通用定时器特点 1. 16/32位向上、向下、向上/向下(中心对齐)计数模式&#xff0c;自动装载计数器&#xff08;TIMXCNT) 。 2. 16位可编程预分频器(TIMx_PSC)&…