进阶:反转二叉树的奇数层

news2024/12/22 23:47:42

目录标题

      • 题目描述
      • 示例
      • 解题思路
      • 代码实现
      • 详细步骤解释
      • 复杂度分析

题目描述

给定一棵完美二叉树的根节点 root,请反转这棵树中每个奇数层的节点值。完美二叉树是指所有叶子节点都在同一层,并且每个非叶子节点都有两个子节点。

示例

示例 1:
输入:

     2
   /   \
  3     5
 / \   / \
7   8 10  11

输出:

     2
   /   \
  5     3
 / \   / \
7   8 10  11

示例 2:
在这里插入图片描述

解题思路

  1. 层次遍历:使用层次遍历来访问每一层的节点。
  2. 奇数层处理:在遍历过程中,对于奇数层(从 1 开始计数),我们需要反转该层的节点值。
  3. 交换节点值:对于奇数层的节点,我们可以使用双指针方法来交换节点的值。

代码实现

import java.util.LinkedList;
import java.util.Queue;

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

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int level = 0;

        while (!queue.isEmpty()) {
            int size = queue.size();
            if (level % 2 == 1) {  // 奇数层
                // 反转当前层的节点值
                for (int i = 0; i < size / 2; i++) {
                    TreeNode leftNode = queue.poll();
                    TreeNode rightNode = queue.poll();

                    // 交换节点值
                    int temp = leftNode.val;
                    leftNode.val = rightNode.val;
                    rightNode.val = temp;

                    // 将子节点加入队列
                    if (leftNode.left != null) {
                        queue.offer(leftNode.left);
                        queue.offer(rightNode.right);
                    }
                    if (leftNode.right != null) {
                        queue.offer(leftNode.right);
                        queue.offer(rightNode.left);
                    }
                }
            } else {  // 偶数层
                for (int i = 0; i < size; i++) {
                    TreeNode node = queue.poll();
                    if (node.left != null) {
                        queue.offer(node.left);
                        queue.offer(node.right);
                    }
                }
            }
            level++;
        }

        return root;
    }

    public static void main(String[] args) {
        // 构建示例二叉树
        TreeNode root = new TreeNode(2);
        root.left = new TreeNode(3);
        root.right = new TreeNode(5);
        root.left.left = new TreeNode(7);
        root.left.right = new TreeNode(8);
        root.right.left = new TreeNode(10);
        root.right.right = new TreeNode(11);

        Solution solution = new Solution();
        TreeNode result = solution.reverseOddLevels(root);

        // 打印结果
        printTree(result);
    }

    private static void printTree(TreeNode root) {
        if (root == null) {
            return;
        }

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

        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                System.out.print(node.val + " ");
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            System.out.println();
        }
    }
}

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

详细步骤解释

  1. 初始化队列

    • 使用一个队列来进行层次遍历,初始时将根节点加入队列。
  2. 层次遍历

    • 使用 while 循环进行层次遍历,直到队列为空。
    • 每次循环开始时,记录当前层的节点数量 size
  3. 奇数层处理

    • 如果当前层数 level 是奇数(从 1 开始计数),则需要反转该层的节点值。
    • 使用双指针方法,从队列中依次取出两个节点,交换它们的值。
    • 将这两个节点的子节点按顺序加入队列。
  4. 偶数层处理

    • 如果当前层数 level 是偶数,则正常进行层次遍历,将当前层的所有节点的子节点按顺序加入队列。
  5. 递增层数

    • 每处理完一层,层数 level 递增 1。
  6. 返回结果

    • 最终返回修改后的根节点 root

复杂度分析

  • 时间复杂度:O(n),其中 n 是树中节点的数量。每个节点都被访问一次。
  • 空间复杂度:O(n),队列在最坏情况下需要存储整棵树的所有节点。

通过上述方法,我们可以有效地反转完美二叉树中每个奇数层的节点值。这个方法利用了层次遍历的思想,简洁且易于理解。

在这里插入图片描述

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

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

相关文章

Harmony商城项目

目录&#xff1a; 1、启动项目看效果图2、代码分析 1、启动项目看效果图 2、代码分析 import CommonConstants from ../constants/CommonConstants; import WomanPage from ./components/WomanPage import ManPage from ./components/ManPage import HomePage from ./component…

Teams集成-会议侧边栏应用开发-实时转写

Teams虽然提供了转写的接口&#xff0c;但是不是实时的&#xff0c;即便使用订阅事件也不是实时的&#xff0c;为了达到实时转写的效果&#xff0c;使用recall.ai的转录和assembly_ai的转写实现。 前提&#xff1a;除Teams会议侧边栏应用开发-会议转写-CSDN博客的基本要求外&a…

实战教程!Zabbix 监控 Spark 中间件配置教程

本文将介绍以JMX方式监控Spark中间件。JMX具有跨平台、灵活性强、监控能力强、易于集成与扩展、图形化界面支持以及安全性与可配置性等多方面的优势&#xff0c;是监控Spark等复杂Java应用程序的重要工具之一。 Apache Spark 是一个开源的大数据处理框架&#xff0c;它提供了快…

【深度学习】ubuntu系统下docker部署cvat的自动标注功能(yolov8 segmentation)

cvat部署自动标注教程 前言step1. 拷贝yolov8项目step2. 创建yolov8的本地镜像step3. 在cvat中构建我们的工作空间 前言 安装docker和cvat的流程我这里就不赘述了&#xff0c;这样的教程还是挺多的&#xff0c;但是对于使用docker在cvat上部署自动标注算法的整个详细流程&#…

【MySQL】MVCC及其实现原理

目录 1. 概念介绍 什么是MVCC 什么是当前读和快照读 MVCC的好处 2. MVCC实现原理 隐藏字段 Read View undo-log 数据可见性算法 3. RC和RR隔离级别下MVCC的差异 4. MVCC&#xff0b;Next-key-Lock 防止幻读 1. 概念介绍 什么是MVCC Multi-Version Concurrency Cont…

通信工程学习:什么是FDD频分双工

FDD:频分双工 FDD(频分双工,Frequency Division Duplexing)是一种无线通信技术,它通过将频谱划分为上行和下行两个不重叠的频段来实现同时双向通信。以下是FDD频分双工的详细解释: 一、定义与原理 定义: FDD是一种无线通信系统的工作模式,其中上行链路(从移动…

以Flask为基础的虾皮Shopee“曲线滑块验证码”识别系统部署

以Flask为基础的虾皮Shopee“曲线滑块验证码”识别系统部署 一、验证码类型二、简介三、Flask应用 一、验证码类型 验证码类型&#xff1a;此类验证码存在两个难点&#xff0c;一是有右侧有两个凹槽&#xff0c;二是滑块的运动轨迹不是直线的&#xff0c;而是沿着曲线走的&…

您的业​​务端点是否完全安全?

根据 2023 年数据泄露调查报告&#xff0c;52% 的数据泄露涉及凭证泄露。这令人担忧&#xff0c;不是吗&#xff1f; 在当今的数字世界中&#xff0c;企业严重依赖技术&#xff0c;保护您的设备&#xff08;端点&#xff09;至关重要。这些设备&#xff08;包括计算机、笔记本…

MySQL从入门到精通 - 基础篇

一、MySQL概述 1. 数据库相关概念 二、SQL &#xff08;1&#xff09;SQL通用语法 &#xff08;2&#xff09;SQL分类 &#xff08;3&#xff09;数据定义语言DDL 数据库操作 表操作 数据类型 1. 数值类型 2. 字符串类型 二进制数据&#xff1a;以二进制格式&#xff08;0和…

uniapp 知识点

自定义导航 在page.json navigationstyle":"custom"navigateTo传参 页面传参只能onLoad(option)里面拿 px和upx的关系 在750设计图中&#xff0c;1px1upx 路由 navigateBack返回上一页 重定向 其实就是把当前页面干掉了 公共组件和页面共同点 computed,watc…

基于微信小程序的智能汽车充电站系设计与实现(源码+定制+文档)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Spring Boot技术:构建高效网上购物平台

第3章 系统分析 3.1 可行性分析 在系统开发之初要进行系统可行分析&#xff0c;这样做的目的就是使用最小成本解决最大问题&#xff0c;一旦程序开发满足用户需要&#xff0c;带来的好处也是很多的。下面我们将从技术上、操作上、经济上等方面来考虑这个系统到底值不值得开发。…

【Vue】Vue3 的初始化过程

核心流程是patch&#xff0c;然后Patch有一个分支&#xff0c;分别处理组件和浏览器原生标签。分别对应processElement和processComponent&#xff0c;从上到下插入&#xff0c;知道处理完成&#xff0c;才把顶层div插入到浏览器。“一次性渲染&#xff0c;而不是一个个一个渲染…

[论文笔记] Chain-of-Thought Reasoning without Prompting

分析: 在CoT解码路径中,我们可以看到模型在第三个位置(𝑖? = 3)开始展示推理过程,并且给出了正确的答案“8”。模型首先识别出说话者有3个苹果,然后识别出爸爸比说话者多2个,即5个苹果,最后将这两个数量相加得到总数8个苹果。 这个例子表明,通过探索替代的解码路径…

【每天学个新注解】Day 7 Lombok注解简解(六)—@With

With 创建一个新的对象&#xff0c;该对象是当前对象的副本&#xff0c;但某些字段的值可以被更改。 1、如何使用 With 可以使用在类上&#xff0c;也可以使用在成员变量上。加在类上相当于给所有成员变量 With可以配合AccessLevel使用&#xff0c;创建出指定访问修饰符的wi…

多模态大模型学习(一)

参考&#xff1a;https://www.bilibili.com/video/BV1kT411o7a6?p2&spm_id_frompageDriver&vd_source156234c72054035c149dcb072202e6be 余弦相似度&#xff0c;让正样本内积趋近于1&#xff0c;负样本趋近于-1。度量学习。N特别大时&#xff0c;负样本远大于正样本&…

PHP之 实现https ssl证书到期提醒,通过企微发送消息

参考文章 https://blog.51cto.com/17099933344/1935194 https://blog.csdn.net/m0_37346206/article/details/127333463 https://www.cnblogs.com/tk-bolg/p/18108106 使用的企微接口 https://qyapi.weixin.qq.com/cgi-bin/message/send 查询 ssl证书到期时间 // ssl证书即将…

基于BiLSTM+Transformer混合模型实现交通流量时序预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

2024年研究生数学建模“华为杯”E题——肘部法则、k-means聚类、目标检测(python)、ARIMA、逻辑回归、混淆矩阵(附:目标检测代码)

文章目录 一、情况介绍二、思路情况二、代码展示三、感受 一、情况介绍 前几天也是参加了研究生数学建模竞赛&#xff08;也就是华为杯&#xff09;&#xff0c;也是和本校的两个数学学院的朋友在网上组的队伍。昨天&#xff08;9.25&#xff09;通宵干完论文&#xff08;一条…

Windows安装openssl开发库

1 下载openssl安装包并安装 下载网址&#xff1a; https://slproweb.com/products/Win32OpenSSL.html 下载对应的安装版本。 双击安装包&#xff0c;一路下一步完成安装。注意&#xff1a;1.安装路径不要有空格&#xff1b; 2. 建议不要把DLL拷贝到系统路径。 2 编辑代码 …