【leetcode热题】填充每个节点的下一个右侧节点指针

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

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

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

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

示例 1:

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

示例 2:

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

解法一 BFS

如果没有要求空间复杂度这道题就简单多了,我们只需要用一个队列做BFSBFS参见 102 题。然后按顺序将每个节点连起来就可以了。

public Node connect(Node root) {if (root == null) {return root;}Queue<Node> queue = new LinkedList<Node>();queue.offer(root);while (!queue.isEmpty()) {int size = queue.size();Node pre = null;for (int i = 0; i < size; i++) {Node cur = queue.poll();//从第二个节点开始,将前一个节点的 pre 指向当前节点if (i > 0) {pre.next = cur;}pre = cur;if (cur.left != null) {queue.offer(cur.left);}if (cur.right != null) {queue.offer(cur.right);}}}return root;
}

解法二 迭代

当然既然题目要求了空间复杂度,那么我们来考虑下不用队列该怎么处理。只需要解决三个问题就够了。

  • 每一层怎么遍历?

    之前是用队列将下一层的节点保存了起来。

    这里的话,其实只需要提前把下一层的next构造完成,到了下一层的时候就可以遍历了。

  • 什么时候进入下一层?

    之前是得到当前队列的元素个数,然后遍历那么多次。

    这里的话,注意到最右边的节点的nextnull,所以可以判断当前遍历的节点是不是null

  • 怎么得到每层开头节点?

    之前队列把当前层的所以节点存了起来,得到开头节点当然很容易。

    这里的话,我们额外需要一个变量把它存起来。

三个问题都解决了,就可以写代码了。利用三个指针,start 指向每层的开始节点,cur指向当前遍历的节点,pre指向当前遍历的节点的前一个节点。

如上图,我们需要把 pre 的左孩子的 next 指向右孩子,pre 的右孩子的next指向cur的左孩子。

如上图,当 cur 指向 null 以后,我们只需要把 pre 的左孩子的 next 指向右孩子。

public Node connect(Node root) {if (root == null) {return root;}Node pre = root;Node cur = null;Node start = pre;while (pre.left != null) {//遍历到了最右边的节点,要将 pre 和 cur 更新到下一层,并且用 start 记录if (cur == null) {//我们只需要把 pre 的左孩子的 next 指向右孩子。pre.left.next = pre.right;pre = start.left;cur = start.right;start = pre;//将下一层的 next 连起来,同时 pre、next 后移} else {//把 pre 的左孩子的 next 指向右孩子pre.left.next = pre.right;//pre 的右孩子的 next 指向 cur 的左孩子。pre.right.next = cur.left;pre = pre.next;cur = cur.next;}}return root;
}

分享下 leetcode 的高票回答的代码,看起来更简洁一些,C++ 写的。

void connect(TreeLinkNode *root) {if (root == NULL) return;TreeLinkNode *pre = root;TreeLinkNode *cur = NULL;while(pre->left) {cur = pre;while(cur) {cur->left->next = cur->right;if(cur->next) cur->right->next = cur->next->left;cur = cur->next;}pre = pre->left;}
}

我的代码里的变量和他的变量对应关系如下。

我的 start    pre    cur|       |      |
他的  pre     cur    cur.next

除了变量名不一样,算法本质还是一样的。

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

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

相关文章

【Qt学习】QPushButton添加图标 并通过快捷键控制该图标

文章目录 1. 介绍2. 操作3. 相关资源文件 1. 介绍 我们知道&#xff1a;QPushButton表示一个按钮&#xff0c;用于响应用户的点击事件。QPushButton可以显示文本、图标或同时显示两者&#xff0c;也可以设置按钮的样式和状态。 我们利用这点 实现一个简单的功能&#xff1a;用…

C#学习总结

1、访问权限 方法默认访问修饰符&#xff1a;private 类默认访问修饰符&#xff1a;internal 类的成员默认访问修饰符&#xff1a;private 2、UserControl的使用 首先添加用户控件 使用时一种是通过代码添加&#xff0c;一种是通过拖动组件到xaml中

【C++】类和对象---友元,内部类,匿名对象详解

目录 友元 友元函数 友元类 内部类 匿名对象 ⭐友元 友元提供了一种突破封装的方式&#xff0c;有时提供了便利。但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以 友元不宜多用。 友元分为&#xff1a;友元函数和友元类。 ⚡友元函数 先看一个问题&#x…

IntelliJ IDEA 创建Spring Boot 项目整合jdbc详细步骤

IntelliJ IDEA 创建Spring Boot 项目&整合jdbc详细步骤 1、打开 IntelliJ IDEA 软件2、使用 "Spring Initializr" 作为项目类型&#xff0c;新建项目工程3、选择对应的SpringBoot版本和依赖4、Spring Boot 项目的结构5、创建一个TestController&#xff0c;并运行…

Opencv实战(2)绘图与图像操作

Opencv实战(2)绘图与图像操作 指路前文&#xff1a;Opencv实战(1)读取与像素操作 三、基本绘图 文章目录 Opencv实战(2)绘图与图像操作三、基本绘图(1).line(2).rectangle(3).circle 四、图像处理(1).颜色空间1.意义2.cvtColor()3.inRange()4.适应光线 (2).形态操作1.腐蚀2.膨…

Spring中的ApplicationContext.publishEvent

简单理解 其实就是监听处理。比如找工作平台上&#xff0c;雇主 employer 发布自己的雇佣条件&#xff0c;目的是平台中有符合条件的求职者时&#xff0c;及时向雇主推荐。求职者发布简历&#xff0c;当平台发现某个求职者比较符合条件&#xff0c;就触发被动&#xff0c;推荐…

uni-app 经验分享,从入门到离职(五)——由浅入深 uni-app 数据缓存

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;什么是数据存储&#x1f9e9;数据存储——存储&#x1f4cc; uni.setStorage(OBJECT)&#x1f4cc; uni.setStorageSync(KEY,DATA) &#x1f9e9;数据存储——获取&#x1f4cc; uni.getStorage(OBJECT)&#x1f4cc; uni.g…

vue 动态渲染本地图片不显示的解决方法

代码更改前 <img class"img" :src"/assets/images/${syntheticalGrade}.png" />data(){return{syntheticalGrade:"1"} }效果图&#xff1a; 解决代码 <img class"img" :src"require(/assets/images/${syntheticalGrad…

Atcoder ABC340 A-D题解

比赛链接:ABC340 话不多说&#xff0c;看题。 Problem A: 签到。 #include <bits/stdc.h> using namespace std; int main(){int a,b,d;cin>>a>>b>>d;for(int ia;i<b;id)cout<<i<<endl;return 0; } Problem B: 还是签到题。一个v…

2024-02-21 作业

作业要求&#xff1a; 复习课上内容 //已完成结构体字节对齐&#xff0c;64位没做完的做完&#xff0c;32位重新都做一遍&#xff0c;课上指定2字节对齐的做一遍&#xff0c;自己验证 //已完成两种验证大小端对齐的代码写一遍复习指针内容 //已完成完善顺序表已写出的…

记录 使用FFMPEG 笔记本摄像头推流

一、使用 FFMPEG 测试摄像头拉流显示 # 获取摄像头名称 ffmpeg -list_devices true -f dshow -i dummy# 我笔记本上的摄像头名称如下 device_pnp_\\?\usb#vid_0408&pid_1020&mi_00#6&199e90f7&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global# 使…

Python之Matplotlib

Matplotlib 是一个综合库&#xff0c;用于创建静态、动画、 和交互式可视化 安装 pip install matplotlib 功能 示例 import matplotlib.pyplot as plt plt.figure() plt.plot([1,2,3],[10,20,30]) plt.show() 官方文档&#xff1a; Matplotlib — Visualization with Pyt…

多窗口编程

六、多窗口编程 QMessageBox消息对话框&#xff08;掌握&#xff09; QMessageBox继承自QDialog&#xff0c;显示一个模态对话框。用于用户前台信息通知或询问用户问题&#xff0c;并接收问题答案。 QDialog的Qt源码中&#xff0c;派生类往往都是一些在特定场合下使用的预设好的…

MySQL数据库集群技术主从复制 一主一从详细讲解

集群技术 集群概述 MySQL复制技术 集群目的 负载均衡 解决高并发 高可用HA 服务可用性 远程灾备 数据有效性 类型 一主一从 一主双从 双主双从 原理 概念 在主库上把数据更改&#xff08;DDL DML DCL&#xff09;记录到二进制日志&#xff08;Binary Log&#xff09;中…

电路设计(28)——交通灯控制器的multisim仿真

1.功能设定 南北、东西两道的红灯时间、绿灯时间均为24S&#xff0c;数码管显示倒计时。在绿灯的最后5S内&#xff0c;黄灯闪烁。有夜间模式&#xff1a;按下按键进入夜间模式。在夜间模式下&#xff0c;数码管显示计数最大值&#xff0c;两个方向的黄灯不停闪烁。 2.电路设计 …

【EI会议征稿通知】2024年软件自动化与程序分析国际学术会议(SAPA 2024)

2024年软件自动化与程序分析国际学术会议&#xff08;SAPA 2024) 2024 International Conference on Software Automation and Program Analysis 在当今科技社会中&#xff0c;软件产业呈快速发展趋势&#xff0c;软件自动化与程序分析技术在提高软件质量、降低开发成本、提升…

fpga_cpu加速

一 cpu流水线执行指令 二 计算机体系结构 注&#xff1a;ARM就是典型的哈佛结构 三 cpu加速 同样采用流水线&#xff0c;哈佛结构的指令效率更高&#xff0c;通过指令预取&#xff0c;提高了流水线的并行度。

ROS1查看版本

目录 方法一方法二 方法一 rosversion -d方法二

[AutoSar]BSW_Com1 Can通信入门

目录 关键词平台说明一、车身CAN简介二、相关模块三、Can报文分类及信号流路径3.1 应用报文3.2 应用报文&#xff08;多路复用multiplexer&#xff09;3.3 诊断报文3.4 网络管理报文3.5 XCP报文&#xff08;标定报文&#xff09; 关键词 嵌入式、C语言、autosar、OS、BSW 平台…

微服务学习

一、服务注册发现 服务注册就是维护一个登记簿&#xff0c;它管理系统内所有的服务地址。当新的服务启动后&#xff0c;它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要Service Provider地址就行了。当下用于服务注册的工具非常多ZooKeeper&#xff0c;Consul&am…