LeetCode题练习与总结:填充每个节点的下一个右侧节点指针Ⅱ--117

一、题目描述

给定一个二叉树:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

示例 1:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

示例 2:

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

提示:

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

二、解题思路

这个问题是一个典型的二叉树的层序遍历问题,但与其打印每层的节点值,我们需要设置每层节点的 next 指针。我们可以使用一个队列来实现层序遍历,并在每层遍历结束后更新每个节点的 next 指针。

解题思路如下:

1. 如果根节点为空,直接返回 null。

2. 初始化一个队列,并将根节点入队。

3. 当队列不为空时,进行以下操作:

  • 获取当前队列的大小,这个大小即为这一层的节点数。
  • 遍历这一层的节点:
    • 出队当前节点。
    • 如果当前节点有左子节点,将左子节点入队。
    • 如果当前节点有右子节点,将右子节点入队。
    • 如果当前节点不是这一层的最后一个节点,将当前节点的 next 指针指向队列中下一个节点(即将出队的节点)。

4. 继续步骤3,直到队列为空。

三、具体代码

import java.util.LinkedList;
import java.util.Queue;class Solution {public Node connect(Node root) {if (root == null) {return null;}Queue<Node> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {int levelSize = queue.size();for (int i = 0; i < levelSize; i++) {Node node = queue.poll();if (i < levelSize - 1) {node.next = queue.peek();}if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}}return root;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 每个节点都会被访问一次,因为我们需要为每个节点设置 next 指针。
  • 在层序遍历中,每个节点都会被加入队列一次,并且也会从队列中移除一次。
  • 因此,时间复杂度主要取决于树的节点数,记为 N
  • 对于每个节点,我们在队列中的操作是常数时间的,即 O(1)
  • 所以,总的时间复杂度是 O(N)
2. 空间复杂度
  • 空间复杂度主要取决于队列中存储的最大节点数,这通常发生在树的最后一层。
  • 在最坏的情况下,树是完全二叉树,最后一层的节点数是前面所有层节点数之和再加1,即 2^(h-1),其中 h 是树的高度。
  • 因此,空间复杂度是 O(2^(h-1)),这可以简化为 O(N),因为在完全二叉树中,h 大约是 log(N),所以 2^(h-1) 是 N/2,这是线性的。
  • 在实际情况中,如果树不是完全二叉树,队列中同时存在的节点数可能会更少,但这不会影响空间复杂度的阶数,它仍然是 O(N)

综上所述,给定代码的时间复杂度是 O(N),空间复杂度也是 O(N)

五、总结知识点

  1. 二叉树结构:代码操作的是一种特殊的二叉树结构,其中每个节点除了左右子节点的指针外,还有一个指向下一个节点的指针。

  2. 层序遍历(广度优先搜索):代码使用了队列来实现二叉树的层序遍历,这是一种广度优先搜索的应用。层序遍历按照树的层级顺序访问节点,通常用于解决与层级相关的树的问题。

  3. 队列的使用:代码中使用了一个 LinkedList 实现的 Queue 来存储每一层的节点。队列是一种先进先出(FIFO)的数据结构,在这里用于按顺序访问每一层的节点。

  4. 迭代与循环:代码中使用了一个 while 循环来迭代处理每一层的节点,直到队列为空,即所有节点都被访问过。

  5. 节点关系的建立:在层序遍历的过程中,代码为每个节点建立了 next 指针,指向其在同一层中的下一个节点。这是通过队列的 peek 方法实现的,它允许我们查看队列的头部元素而不移除它。

  6. 边界条件处理:代码首先检查了根节点是否为空,这是对输入数据的有效性检查,确保了代码的鲁棒性。

  7. 节点入队:在遍历过程中,代码将每个节点的非空子节点加入队列,为下一层的遍历做准备。

  8. 链表操作:虽然代码操作的是二叉树,但在每一层中,节点的 next 指针形成了一个链表。代码中的 node.next = queue.peek(); 操作实际上是在链表中建立节点之间的关系。

  9. 常数时间操作:代码中对于每个节点的处理是常数时间的,这是因为队列的入队和出队操作都是 O(1)

  10. 递归与迭代的选择:虽然二叉树的问题通常可以用递归方法解决,但这里选择了迭代方法,使用队列来实现层序遍历。递归和迭代是解决树相关问题的两种常见方法。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

第二十七章HTML.CSS综合案例

1.产品介绍 效果图如下&#xff1a; 代码部分如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

计算机毕业设计Python+Spark新能源汽车推荐系统 汽车大数据 汽车数据分析 汽车可视化 汽车爬虫 大数据毕业设计 大数据毕设 知识图谱 深度学习

黄河交通学院本科毕业设计&#xff08;论文&#xff09;任务书 学院&#xff1a;智能工程学院 学生姓名 刘丹杰 专业班级 大数据20-1班 学号 2080910T01521 指导教师 炎士涛 职称 副教授 学位 硕士 题目名称 基于Hadoop的新能源汽车销售数据分析系统的设计与实现…

【Unity美术】spine软件的使用—2D动画的制作

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

群体优化算法---灰狼优化算法学习介绍以及在卷积神经网络训练上的应用

**长文预警**介绍 在自然界中&#xff0c;狼群的社会结构和捕猎策略展现了高度的智能和协调性&#xff0c;灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;正是受此启发提出的一种群体智能优化算法。GWO主要模拟了灰狼的社会等级制度和捕猎行为&#xff0c;其核…

计算机毕业设计hadoop+spark+hive知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习

新余学院本科毕业设计(论文)开题报告 学 号 202253025 学生姓名 毛维星 届 别 24届 专 业 数据科学与大数据技术 指导教师 姓名及职称 潘诚 研究生 毕业设计 (论文)题目 基于HadoopSpark的音乐数据仓库的设计与实现 开 题 报 告 内 容 选题的依据…

使用Python操作Redis

大家好&#xff0c;在当今的互联网时代&#xff0c;随着数据量和用户量的爆发式增长&#xff0c;对于数据存储和处理的需求也日益增加。Redis作为一种高性能的键值存储数据库&#xff0c;以其快速的读写速度、丰富的数据结构支持和灵活的应用场景而备受青睐。本文将介绍Redis数…

加密经济浪潮:探索Web3对金融体系的颠覆

随着区块链技术的快速发展&#xff0c;加密经济正在成为全球金融领域的一股新的浪潮。而Web3作为下一代互联网的代表&#xff0c;以其去中心化、可编程的特性&#xff0c;正深刻影响着传统金融体系的格局和运作方式。本文将深入探讨加密经济对金融体系的颠覆&#xff0c;探索We…

C++数组实现推箱子游戏

前言 我是三天打鱼两天晒网的闲人,今天跟着课程视频学习c的数组的运用. 准备好游戏用到的图片资源 代码逻辑实现 #include<iostream> #include<graphics.h> #include<string> #include<conio.h>using namespace std;//设置画布大小 #define SCREEN…

kafka-守护启动

文章目录 1、kafka守护启动1.1、先启动zookeeper1.1.1、查看 zookeeper-server-start.sh 的地址1.1.2、查看 zookeeper.properties 的地址 1.2、查看 jps -l1.3、再启动kafka1.3.1、查看 kafka-server-start.sh 地址1.3.2、查看 server.properties 地址 1.4、再次查看 jps -l 1…

【python】OpenCV—Cartoonify and Portray

参考来自 使用PythonOpenCV将照片变成卡通照片 文章目录 1 卡通化codecv2.medianBlurcv2.adaptiveThresholdcv2.kmeanscv2.bilateralFilter 2 肖像画cv2.divide 1 卡通化 code import cv2 import numpy as npdef edge_mask(img, line_size, blur_value):gray cv2.cvtColor(…

代码随想录算法训练营第二十八天|93.复原IP地址 ,78.子集 ,90.子集II

93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; class Solution {ArrayList<String> results new ArrayList<>();public List<String> restoreIpAddresses(String s) {if(s.length() > 12){return new ArrayList<>();}char[] ipChars …

OBS+nginx+nginx-http-flv-module实现阿里云的推流和拉流

背景&#xff1a;需要将球机视频推送到阿里云nginx&#xff0c;使用网页和移动端进行播放&#xff0c;以前视频格式为RTMP&#xff0c;但是在网页上面播放RTMP格式需要安装flash插件&#xff0c;chrome浏览器不给安装&#xff0c;调研后发现可以使用nginx的模块nginx-http-flv-…

MySQL之查询性能优化(四)

查询性能优化 MySQL客户端/服务器通信协议 一般来说&#xff0c;不需要去理解MySQL通信协议的内部实现细节&#xff0c;只需要大致理解通信协议是如何工作的。MySQL客户端和服务器之间的通信协议是"半双工"的&#xff0c;这意味着&#xff0c;在任何一个时刻&#…

9.抽象类和接口

抽象类 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类 比如&#xff1a; 我…

Vue进阶之Vue无代码可视化项目(二)

Vue无代码可视化项目 项目初始化路由子路由错误示范正确示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts项目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由样式App.vue进一步的App.vue项目初始化 路由 router i…

高精度滚珠丝杆在自动化生产中的关键因素!

如今&#xff0c;自动化技术正以前所未有的速度改变着人们的生活和工作方式&#xff0c;特别是在高精度精密设备的制造与应用领域&#xff0c;提高生产效率和优化生产流程正变得越来越重要。在自动化生产中&#xff0c;滚珠丝杆的优化应用对于提高生产效率、保证产品质量至关重…

k8s Pods漂移时间配置

默认为300秒 apiVersion: apps/v1 kind: Deployment metadata:name: my-test spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80tolerations:- key: &…

面试二十六、c++语言级别的多线程编程

一、 多线程编程 ​​​​​ 这里的c语言级别的多线程和linux的有一定的区别&#xff0c;c语言级别提供的多线程比较严格&#xff0c;如果主线程结束了&#xff0c;但是子线程没有结束&#xff0c;进程就会异常终止&#xff0c;而linux不会&#xff0c;会继续执行。 二、模拟卖…

LLama学习记录

学习前&#xff1a; 五大问题&#xff1a; 为什么SwiGLU激活函数能够提升模型性能&#xff1f;RoPE位置编码是什么&#xff1f;怎么用的&#xff1f;还有哪些位置编码方式&#xff1f;GQA&#xff08;Grouped-Query Attention, GQA&#xff09;分组查询注意力机制是什么&…

FL Studio21.2.8中文版水果音乐制作的革新之旅!

在数字化浪潮的推动下&#xff0c;音乐制作领域经历了翻天覆地的变化。从最初的模拟技术到如今的全数字化处理&#xff0c;音乐制作的门槛被大幅降低&#xff0c;越来越多的音乐爱好者和专业人士开始尝试自行创作和编辑音乐。在这个过程中&#xff0c;各种专业音乐制作软件成为…