当前位置: 首页 > news >正文

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

目录标题

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

题目描述

给定一棵完美二叉树的根节点 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),队列在最坏情况下需要存储整棵树的所有节点。

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

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SLF4J报错log4j又报错
  • 【C++】入门基础知识-1
  • 【C#生态园】构建高效PDF应用:全面解析C#六大PDF生成库
  • 2024最新国内镜像源设置(npm、yarn、pnpm)
  • 皮肤病检测-目标检测数据集(包括VOC格式、YOLO格式)
  • 【系统架构设计师】专题:软件工程基础
  • CAT1 RTU软硬件设计开源资料分析(TCP协议+Modbus协议+GNSS定位版本 )
  • 数据仓库ETL开发规范
  • MISC - 第二天(wireshark,base64解密图片,zip文件伪加密,LSB二进制最低位,ARCHPR工具)
  • 计算机网络1
  • django drf 统一Response格式
  • 【机器学习(十一)】机器学习分类案例之是否患糖尿病预测—XGBoost分类算法—Sentosa_DSML社区版
  • 精密制造的革新:光谱共焦传感器与工业视觉相机的融合
  • node.js从入门到快速开发一个简易的web服务器
  • Vue 响应式监听 Watch 最佳实践
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Angular2开发踩坑系列-生产环境编译
  • css的样式优先级
  • golang 发送GET和POST示例
  • HTTP--网络协议分层,http历史(二)
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • js中的正则表达式入门
  • Python连接Oracle
  • Python十分钟制作属于你自己的个性logo
  • vue:响应原理
  • 飞驰在Mesos的涡轮引擎上
  • 实习面试笔记
  • 微信小程序开发问题汇总
  • 译自由幺半群
  • linux 淘宝开源监控工具tsar
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​字​节​一​面​
  • # wps必须要登录激活才能使用吗?
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #AngularJS#$sce.trustAsResourceUrl
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (4)事件处理——(7)简单事件(Simple events)
  • (day18) leetcode 204.计数质数
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (poj1.3.2)1791(构造法模拟)
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (动态规划)5. 最长回文子串 java解决
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)模仿学习-完成后台管理页面查询
  • (万字长文)Spring的核心知识尽揽其中
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ***详解账号泄露:全球约1亿用户已泄露
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • ../depcomp: line 571: exec: g++: not found