算法的学习笔记—二叉树的镜像(牛客JZ27)

img

😀前言
在二叉树相关的问题中,镜像操作是一个非常经典且常见的题目。本文将通过一道具体的题目,详细讲解如何将一棵二叉树转换为它的镜像,并提供实现该操作的Java代码示例。

🏠个人主页:尘觉主页

文章目录

  • 😊二叉树的镜像
    • 🤔问题描述
      • 😉示例
      • 💗数据范围
      • 💗数据要求
    • 🧐解题思路
      • 🥳Java实现
      • 🥰代码解析
      • 💝空间复杂度与时间复杂度
    • 😄总结

😊二叉树的镜像

牛客网

🤔问题描述

给定一棵二叉树,要求将其转换为该二叉树的镜像。换句话说,二叉树的左子树和右子树需要交换位置。

😉示例

  • 示例1:

    输入:{8,6,10,5,7,9,11}

    输出:{8,10,6,11,9,7,5}

    说明:根据输入二叉树的结构,它的镜像应该是如下形式:

比如:源二叉树

img

镜像二叉树

img

  • 示例2:

    输入:{}

    输出:{}

    说明:空树的镜像还是空树。

💗数据范围

  • 二叉树的节点数 0 ≤ n ≤ 1000
  • 二叉树每个节点的值 0 ≤ val ≤ 1000

💗数据要求

  • 空间复杂度 O(n)

  • 本题也有原地操作,即空间复杂度 O(1)的解法,时间复杂度 O(n)

🧐解题思路

将二叉树转换为镜像的操作本质上就是交换每个节点的左右子树。我们可以通过递归的方法遍历整棵树,并在每个节点上进行左右子树的交换。

具体步骤如下:

  1. 递归终止条件:
    • 如果当前节点为null,说明已经到达叶子节点的下一层,返回null
  2. 交换左右子树:
    • 通过一个辅助函数,将当前节点的左子树和右子树交换。
  3. 递归处理:
    • 递归地处理左右子树,继续向下遍历,直到整个二叉树的左右子树都被交换完毕。

🥳Java实现

下面是具体的Java代码实现:

public class Solution {// 主函数,执行二叉树镜像操作public TreeNode Mirror(TreeNode root) {// 如果根节点为空,直接返回if (root == null)return root;// 交换当前节点的左右子树swap(root);// 递归处理左右子树Mirror(root.left);Mirror(root.right);// 返回镜像后的根节点return root;}// 辅助函数,交换当前节点的左右子树private void swap(TreeNode root) {// 临时存储左子树TreeNode temp = root.left;// 左子树变为右子树root.left = root.right;// 右子树变为左子树root.right = temp;}
}

🥰代码解析

  1. Mirror方法:
    • 这是主函数,用于执行二叉树的镜像操作。首先检查当前节点是否为空,如果是,直接返回null。否则,调用swap方法交换当前节点的左右子树,然后递归处理左右子树。
  2. swap方法:
    • 该方法用于交换当前节点的左右子树。我们使用一个临时变量来存储左子树,然后将右子树赋值给左子树,最后将临时变量中的左子树赋值给右子树,从而完成交换。

💝空间复杂度与时间复杂度

  • 空间复杂度: 在递归实现中,主要的空间消耗在于递归调用栈。最坏情况下(如二叉树为链式结构),递归深度为O(n),因此空间复杂度为O(n)。如果要求原地操作,理论上可以通过迭代的方式实现,空间复杂度为O(1)
  • 时间复杂度: 由于每个节点都需要访问并进行交换操作,因此时间复杂度为O(n)

😄总结

镜像二叉树的问题是二叉树操作中的经典问题,通过递归的方法可以高效地实现。在实际应用中,理解这个问题有助于掌握二叉树的基本操作和递归思想。这一操作在图像处理、数据结构调整等场景中都有着广泛的应用。希望通过本文的讲解,您能够掌握二叉树镜像的基本概念和实现方法。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

CRNN不定长验证码识别

原文:CRNN不定长验证码识别 - 知乎 (zhihu.com) 一、不定长验证码识别 关于验证码识别的任务,我们可以通过使用卷积神经网络采用多标签分类的方法来完成,但是当验证码是不定长的时候,就无法使用多标签分类的方法来解决了,在这类任务中,识别的目标是类似于序列的长条形图…

React原理之Fiber详解

前置文章: React原理之 React 整体架构解读React原理之整体渲染流程 -----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 😊----- 在React原理之 React 整体架构解读中,简单介绍了 Fiber 架构,也了解了 Fiber 节点的…

IT服务标准化知识体系攻略(至简)

标准是为了在一定范围内获得最佳秩序 ,经协商一致制定并由公开机构批准共同使用和重复使用的和中规范性文件。标准是标准化活动的主要成果之一。国家标准的制定有一套正常程序,分为预阶段、立项阶段、起草阶段、征求意见阶段、审查阶段、批准阶段、出版阶…

88.SAPUI5 Model Binding的问题-在view更改数据,model却不变

目录 1.背景 2.sap.ui.model.BindingMode sap.ui.model.BindingMode.OneWay sap.ui.model.BindingMode.TwoWay 3.oModel.setDefaultBindingMode 方法说明 execOneWay方法 execTwoWay方法 1.背景 在做一个UI5项目,后台读取sap.ui.model.Model后,把…

C++高性能编程:ZeroMQ vs Fast-DDS发布-订阅模式下性能对比与分析

文章目录 0. 引言1. 目标:ZeroMQ与Fast-DDS性能对比2. ZeroMQ vs Fast-DDS - 延迟基准测试2.1 一对一发布-订阅延迟2.2 一对多发布-订阅延迟 3. ZeroMQ vs Fast-DDS - 吞吐量基准测试4. 方法论5. 结论6. 参考 0. 引言 高要求的分布式系统催生了对轻量级且高性能中间…

C++:命名空间与输入输出

目录 前言 一、命名空间 1.1 namespace的价值 1.2 namespace的定义 1.3 命名空间的使用 二、C输入&输出 前言 C是一种面向对象的计算机程序设计语言,‌它扩展了C语言的功能,‌并引入了面向对象编程的概念,‌如类、‌继承和多态等&a…

【图形学】TA之路-矩阵应用平移-旋转-大小

矩阵应用:在 Unity 中,Transform 和矩阵之间的关系非常密切。Transform 组件主要用于描述和控制一个物体在三维空间中的位置、旋转和缩放,而这些操作背后实际上都是通过矩阵来实现的 1. Transform 组件与矩阵的关系 Transform 组件包含以下…

基于django的影音播放网站 /基于python的影视网站/影视播放系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

论文阅读笔记:The Graph Neural Network Model

论文来源 IEEE Transactions on Neural Networks,Volume: 20 Issue: 1 背景 图神经网络模型本身具有广泛的使用背景,由于我个人研究交通流量预测的需要,此处仅考虑深度学习领域。图结构指的是由节点node和若干个连接的边edge组成的一种数据…

Spring Boot 3.3 【四】Spring Boot 整合JPA

🌟 技术人聊管理 请关注 【技术管理修行】 一、JPA 简介 Spring Data JPA 是 Spring Data 项目的一部分,它为使用 Java Persistence API (JPA) 进行数据库访问提供了一种非常简便的方式。Spring Data JPA 的主要目的是简化基于 JPA 的数据访问层的开发工…

XSS-过滤特殊符号的正则绕过

目录 靶场练习地址:https://xss.pwnfunction.com/ 题目源码: 代码分析: 方法一:匿名函数 方法二:使用eval函数绕过限制 示例: 方法三:利用hash绕过 靶场练习地址:https://xs…

【Linux网络】NAT技术

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 引言 随着互联网的飞速发展,IP地址资源日益紧张,这促使了NAT(Network Address Translation,网络地址转换)技术的诞生与发展。NAT技术不仅解决了IPv4…

MySQL实现SQL Server中UPDLOCK与READPAST组合功能

碰到一位同事求助解决消息中台一个线上的bug,具体描述如下: 首先有一张主表记录消息待发送的内容,一张子表记录本条消息的发送状态。若发送成功则将此条消息的发送状态修改为已发送并做逻辑删除。代码通过定时任务每2s轮询子表,如…

安装cuda支持的opencv-python Windows版本(包含常见错误处理)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G技术研究。 博客内容主要围绕…

节点使用简介:comfyui-photoshop

1、安装comfyui-photoshop 略过 一点要注意的是:在Photoshop上的安装增效工具,要通过Creative Cloud 桌面应用程序进行安装,才能成功在增效工具中显示,直接通过将文件解压到Plug-ins路径行不通(至少对我来说行不通&am…

C++语言基础|函数的嵌套与递归

C语言基础|函数的嵌套与递归 1. 函数的嵌套调用2. 函数的递归调用 1. 函数的嵌套调用 在一个函数中调用其它函数叫函数的嵌套。C中函数的定义是平行的,除了main()以外,都可以互相调用。函数不可以嵌套定义,但可以嵌套调用。比如函数1调用了函…

【百度】25届秋招内推码

内推码 IV1RBB 介绍 📣 百度TPG技术中台事业群组—深度学习技术平台部 25届校招正在进行中,可通过定向内推形式get校招绿色通道 ! 欢迎联系我定向内推 🌟【部门介绍】 飞桨(PaddlePaddle)以百度多年的深度…

前端技巧——复杂表格在html当中的实现

应用场景 有时候我们的表格比较复杂,表头可能到处割裂,我们还需要写代码去完成这个样式,所以学会在原生html处理复杂的表格还是比较重要的。 下面我们来看这一张图: 我们可以看到有些表头项的规格不太一样,有1*1 2*…

阶段练习——minishell

目录 (一)文件复制(my_cp函数) (二)文件内容查看(my_cat函数) (三)切换目录(my_cd函数) (四)列出目录内容…

Elasticsearch、Easy-es 快速入门 SearchAfterPage分页 若依前后端分离 Ruoyi-Vue SpringBoot

一、环境安装 Elasticsearch ik分词器 1.1 下载解压Elasticsearch-7.x版本,越高越好,低版本有Log4j漏洞,Easy-es目前支持7.x 1.2 IK中文分词器 将对应Elasticsearch版本IK放进文件夹,Elasticsearch-7.6.1,ik对应版…