反转二叉树(递归非递归解决)

news2024/11/15 10:33:52

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

方法一:递归解法

递归是处理树结构问题的常用方式,二叉树的问题通常可以通过递归轻松解决。在这道题中,递归的思路是:

  • 如果当前节点是 null,直接返回 null
  • 否则,交换当前节点的左右子树,并递归处理左右子树的翻转。

递归的流程如下:

  1. 先检查当前节点是否为空,如果为空则直接返回。
  2. 交换左右子树,将左子树存储在临时变量中,左右互换。
  3. 递归地对左右子树进行同样的操作。
  4. 返回根节点。
递归代码实现:
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }

        // 交换左右子树
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;

        // 递归翻转左右子树
        invertTree(root.left);
        invertTree(root.right);

        return root;
    }
}
复杂度分析:
  • 时间复杂度:O(n),其中 n 是二叉树中的节点数。每个节点被访问一次,因此总的时间复杂度是线性的。
  • 空间复杂度:O(h),其中 h 是二叉树的高度。递归栈的最大深度取决于树的高度,因此空间复杂度与树的高度成正比。在最坏的情况下(树呈现为一条链),高度为 n

方法二:非递归解法 (BFS)

非递归的解法通常通过遍历二叉树的方式来实现。在这道题中,我们可以采用广度优先搜索(BFS)来逐层交换每个节点的左右子树。具体思路是:

  1. 使用一个队列存储树中的节点。
  2. 每次从队列中取出一个节点,交换该节点的左右子树。
  3. 将交换后的左右子树(非空)依次加入队列,继续遍历直到队列为空。
非递归代码实现:
import java.util.LinkedList;
import java.util.Queue;

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);

        while (!queue.isEmpty()) {
            TreeNode current = queue.poll();

            // 交换当前节点的左右子树
            TreeNode temp = current.left;
            current.left = current.right;
            current.right = temp;

            // 将非空的左右子树加入队列
            if (current.left != null) {
                queue.add(current.left);
            }
            if (current.right != null) {
                queue.add(current.right);
            }
        }

        return root;
    }
}
复杂度分析:
  • 时间复杂度:O(n),与递归方法相同,每个节点被访问一次。
  • 空间复杂度:O(n),使用了一个队列来存储每一层的节点,最坏情况下,队列中的节点数会达到 n/2(树的最底层节点数),因此空间复杂度为 O(n)。

总结:

  • 递归解法:简洁直观,代码简单易懂,但可能受到递归深度的限制。
  • 非递归解法:避免了递归栈的开销,适合树的深度较大时使用。

无论是递归还是非递归解法,关键点在于:每次将当前节点的左右子树交换,然后继续对其子节点进行相同操作。两种方法都能高效地解决二叉树的翻转问题。

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

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

相关文章

【RLHF】浅谈ChatGPT 等大模型中的RLHF算法

本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅!​个人主页:有梦想的程序星空​个人介绍:小编是人工智能领域硕士,全栈工程师,深耕Flask后端开发、数据挖掘、NLP、Android开发、自动化等领域,有较丰…

生成tekton dashboard

我们在之前的&#xff08;安装和构建ci&#xff09;实践中&#xff0c;用到都是tekton cli&#xff0c;查看ci执行情况都是通过logs&#xff0c;不是很友好。 tekton dashboard提供了很多的ui界面。这里我们来安装并使用。 1. 创建dashboard.yaml apiVersion: v1 kind: Names…

[Deepin] Deepin 安装 MEGA

下载debian包 wget https://mega.nz/linux/repo/Debian_12/amd64/megasync-Debian_12_amd64.deb注意&#xff0c;因文章过时等原因&#xff0c;请去官网下载最新包 https://mega.io/zh-hans/desktop#download 模拟安装 下载后执行命令 udo apt install --simulate ./megasy…

2023 CCPC(秦皇岛)现场(第二届环球杯.第 2 阶段:秦皇岛)部分题解

所有题目链接&#xff1a;Dashboard - The 2023 CCPC (Qinhuangdao) Onsite (The 2nd Universal Cup. Stage 9: Qinhuangdao) - Codeforces 中文题面&#xff1a; contest-37054-zh.pdf (codeforces.com) G. Path 链接&#xff1a; Problem - G - Codeforces 中文题面 测试…

【Hadoop|HDFS篇】NameNode和SecondaryNameNode

1. NN和2NN的工作机制 思考&#xff1a;NameNode中的元数据是存储在哪里的&#xff1f; 首先&#xff0c;我们做个假设&#xff0c;如果存储在NameNode节点的磁盘中&#xff0c;因为经常需要进行随机访 问&#xff0c;还有响应客户请求&#xff0c;必然是效率过低。因此&…

Java面试题——第五篇(Java基础)

1. main方法为什么是静态的&#xff0c;能不能改为非静态的 由于JVM在运行Java应用程序的时候&#xff0c;首先会调用main方法&#xff0c;调用时不实例化这个类的对象&#xff0c;而是通过类名直接调用因此需要限制为public static。 不能改为非静态&#xff0c;main方法必须声…

JavaWeb - Mybatis - 基础操作

删除Delete 接口方法&#xff1a; Mapper public interface EmpMapper { //Delete("delete from emp where id 17") //public void delete(); //以上delete操作的SQL语句中的id值写成固定的17&#xff0c;就表示只能删除id17的用户数据 //SQL语句中的id值不能写成…

美妆行业的画册电子版如何制作?

美妆行业的画册电子版制作&#xff0c;首先要确立画册的主题和内容。针对美妆行业特点&#xff0c;可以展示产品系列、护肤理念、品牌故事、用户评价等内容。同时&#xff0c;为了吸引目标受众&#xff0c;需要注重画面美观和时尚感&#xff0c;突出产品特点和品牌形象。 在选择…

如何快速理解网络编程

目录 前言 一、网络编程的概念 二、TCP/IP架构体系的各层作用 三、网络通信中常用的专业术语 四、IP地址的分类和划分 前言 在一个主机中&#xff0c;我们能进行进程间通信&#xff0c;但是随这时代发展&#xff0c;我们不可能只是在单独的一个主机中传输数据&#xff0c;&…

H3C SR-MPLS通过OSPF通告SID配置

首先在配置前理解几个基本概念 Prefix SID配置 统一分配和配置&#xff08;全局规划&#xff09;loopback和prefix sidPrefix SIDSRGB Base&#xff08;16000&#xff09;index Adj SID自动生成 对应SR节点间的互联链路SR节点本地标识&#xff0c;从设备本地Segment池中动态…

观趋势 谋发展 2024 SSHT上海智能家居展有哪些创新呈现?

引言&#xff1a;大数跨境发布的《2024全球智能家居市场洞察报告》显示&#xff0c;智能家居市场正迎来快速增长&#xff0c;预计从2024年的1215.9亿美元增长至2032年的6332.0亿美元&#xff0c;复合年增长率为22.9%。 近年来&#xff0c;随着物联网、AI等底层技术的飞速进步&…

I/O管理【上】

目录 一. I/O设备的概念与分类二. I/O控制器(考的频率不高&#xff0c;但还是要有印象)三. I/O控制方式&#xff08;重要考点&#xff09;3.1 程序直接控制方式3.2 中断驱动方式3.3 DMA方式3.4 通道控制方式 四. I/O软件层次结构4.1用户层软件4.2 设备独立性软件4.3 设备驱动程…

摩博会前瞻:OneOS智能超高安全性彩屏,百元级价格,高性能骑行新选择!

引言 中国国际摩托车博览会即将启动&#xff01;倒计时7天&#xff0c;OneOS与恒石智能联合打造的十几款智能彩屏仪表首次展出&#xff01;十几款彩屏仪表由国产HMI芯片Model系列驱动&#xff0c;OneOS实时操作系统&#xff0c;100%国产自主设计&#xff0c;实现百元级超高安全…

DP(Display Port)

DP&#xff08;Display Port&#xff09; 一、DP简介 DisplayPort是由美国视频电子协会&#xff08;VESA&#xff1a;Video Electronics Standards Association&#xff09;在2006年5月提出的一种新型数字显示接口规范&#xff0c;主要用于源端和设备端&#xff08;如电脑显示…

虚拟机中使用gparted扩展硬盘容量

步骤1&#xff1a;安装gparted apt-get install gparted 步骤2&#xff1a;关闭虚拟机&#xff0c;扩展硬盘容量 步骤3&#xff1a;开启虚拟机&#xff0c;找到gparted软件&#xff0c;双击 步骤4&#xff1a;扩展&#xff0c;点击原磁盘&#xff0c;点击扩展&#xff0c;点击保…

深度学习(十一)-PaddlePaddle

PaddlePaddle PaddlePaddle&#xff08;Parallel Distributed Deep Learning&#xff0c;中文名飞桨&#xff09; 是百度公司推出的开源、易学习、易使用的分布式深度学习平台 源于产业实践&#xff0c;在实际中有着优异表现 支持多种机器学习经典模型 优点 易用性。语法简…

网页时装购物系统:Spring Boot框架的创新设计

第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中人们对时装购物系统方面的要求也在不断提高&#xff0c;喜欢购物的人数更是不断增加&#xff0c;使得时装购物系统的开发成为必需而且紧迫的…

搭建线上虚拟展厅,需要哪些技术?

搭建虚拟展厅需要一系列先进的技术支持&#xff0c;以确保能够为用户提供逼真、生动、互动的参观体验。以下是搭建虚拟展厅所需的主要技术&#xff1a; 1. 三维建模与渲染技术 三维建模&#xff1a;利用三维建模软件&#xff08;如Maya、3D MAX、Blender等&#xff09;建造三维…

Python | Leetcode Python题解之第389题找不同

题目&#xff1a; 题解&#xff1a; class Solution:def findTheDifference(self, s: str, t: str) -> str:return chr(sum(map(ord, t)) - sum(map(ord, s)))

基于free5gc模拟5G核心网和UERANSIM模拟5G用户设备的模拟5G网络环境的部署搭建方法总结和解析。

简介&#xff1a;下文介绍了基于free5gc模拟5G核心网和UERANSIM模拟5G用户设备的模拟5G网络环境的部署搭建方法&#xff0c;并且通过完成相关配置&#xff0c; 简单实现测试5G用户设备接入核心网的注册流程、去注册流程&#xff0c;模拟了一个用户设备通过模拟核心网进行实际的…