LeetCode:116.填充每个节点的下一个右侧节点指针

文章目录

  • 1.层次遍历
  • 2.使用next层序遍历
  • 3.递归方法

LeetCode:116.填充每个节点的下一个右侧节点指针
题目:
在这里插入图片描述
示例:
在这里插入图片描述
分析题意容易关注到只需要将每层结点连接起来,因此我们只需要把每层结点求出来即可,即使用层次遍历。

1.层次遍历

使用队列方式的层序遍历,将一层的结点进行连接。

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)
在这里插入图片描述

class Solution {
public:Node* connect(Node* root) {if(!root) return NULL;queue<Node * > q;q.push(root);while(!q.empty()){int size = q.size();for(int i = 0;i < size;++i){if(q.front()->left)q.push(q.front()->left);if(q.front()->right)q.push(q.front()->right);Node * cur = q.front();q.pop();if(!q.empty() && i != size - 1)cur->next = q.front();}}return root;}
};

在这里插入图片描述

2.使用next层序遍历

进一步思考我们可以发现,由于我们将每层连接起来了,因此我们可以直接使用next指针实现层序遍历的方法!

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)
在这里插入图片描述

class Solution {
public:Node* connect(Node* root) {Node* start = root;while(start != nullptr){Node * floor = start;start = start->left;//start指向下一层的开始for(;floor != nullptr;floor = floor->next){//遍历该层if(floor->left){//是否有儿子floor->left->next = floor->right;if(floor->next)floor->right->next = floor->next->left;}}}return root;}
};

3.递归方法

根据进阶提示,也能使用递归方法,但是感觉递归的方法很难想。
主要体现在:

单子树递归肯定无法实现,两颗子树之间的连接,因此我们需要寻求更好的递归函数。

受到力扣hot100:101. 对称二叉树的启发,我们可以尝试使用双指针将两颗子树连接起来。
在这里插入图片描述

将整棵树画出来,从上向下看,我们如果使用双指针pq,如果要连接该层(比如2连向3),则先将p连向q,那么我们定义函数的功能是让p连向q

然后由于我们递归向下,所以递归方式要求不同子树之间也需要连接,则要满足:

  • p的子树要连起来,所以递归调用函数传入p->leftp->right
  • q的子树要连起来,所以递归调用函数传入q->leftq->right
  • pq之间要连起来,所以递归调用函数传入p->rightq->left

因此我们就实现了这个递归:

    void connect_node(Node * & p,Node * & q){if(!p || !q) return;p->next = q;//连接p和qconnect_node(p->right,q->left);//中间需要连起来connect_node(p->left,p->right);//左子树需要连起来connect_node(q->left,q->right);//右子树需要连起来return;}

在这里插入图片描述


时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1) (根据题设知忽略递归栈空间开销)
在这里插入图片描述

class Solution {
public:Node* connect(Node* root) {if(!root) return NULL;connect_node(root->left,root->right);return root;}void connect_node(Node * & p,Node * & q){if(!p || !q) return;p->next = q;connect_node(p->right,q->left);connect_node(p->left,p->right);connect_node(q->left,q->right);return;}
};

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

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

相关文章

【每日刷题】Day37

【每日刷题】Day37 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 2391. 收集垃圾的最少总时间 - 力扣&#xff08;LeetCode&#xff09; 2. 1614. 括号的最大嵌套深度…

免费AI工具教学知识库

在数字化时代&#xff0c;AI技术正以前所未有的速度改变着世界。你是否也渴望踏入这个充满无限可能的领域&#xff1f;好消息&#xff01;现在有一个免费的AI知识库向你敞开大门&#xff0c;助你轻松掌握AI的奥秘。 这个知识库内容丰富&#xff0c;覆盖从AI入门必学到AI使用进阶…

vue3属性透传(透传 Attributes),支持多个根节点,且可以在JavaScript 中访问透传 Attributes

支持多个根节点&#xff0c;且可以在JavaScript 中访问透传 Attributes Index.vue: <script setup> import { ref, onMounted } from vue import Child from ./Child.vue import ./index.cssconst handleClick () > {console.log(1) }onMounted(() > {}) </s…

【3dmax笔记】036:FDD修改器

一、FDD修改器简介 FDD修改器是对模型进行变形处理的命令,FDD后面的数字越大,编辑节点越多,编辑越精细,但是FDD控制点多的同时,模型上的节点也要多才可以。 FFD修改器是一种非常灵活的修改器,可以让我们对模型进行自由的变形操作。通过在FFD修改器中设置变形点,我们可…

Celery Redis 集群版连接和PyCharm启动配置

目录 使用Redis cluster版作为broker原因 PyCharm配置 使用Redis cluster版作为broker 在celery5及其之前版本&#xff0c;需要配置如下才可行 celery_app.conf.update( broker_transport_options{“global_keyprefix”: “{celery}:”}, ) 原因 https://github.com/celery/…

uniapp音乐播放整理

一、前置知识点 1.1 音频组件控制-uni.createInnerAudioContext() 创建并返回内部 audio 上下文 innerAudioContext 对象。 主要用于当前音乐播放&#xff1b; 1.1.1 innerAudioContext属性 属性类型说明只读平台差异说明srcString音频的数据链接&#xff0c;用于直接播放…

【Python系列】Python中列表属性提取

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Java 查询树结构列表,递归删除子节点】

Java 获取列表树结构&#xff0c;递归删除子节点 数据库表结构ModelVO查询树结构列表递归删除子节点 数据库表结构 Model Data AllArgsConstructor NoArgsConstructor public class TBaseDept {/** ID */private String id;/** 单位名称 */private String fdName;/** 部门编码…

山东大学软件学院创新项目实训开发日志——第11周

山东大学软件学院创新项目实训开发日志——第11周 项目名称&#xff1a;ModuFusion Visionary&#xff1a;实现跨模态文本与视觉的相关推荐 -------项目目标&#xff1a; 本项目旨在开发一款跨模态交互式应用&#xff0c;用户可以上传图片或视频&#xff0c;并使用文本、点、…

Kafka效率篇-提升效率三板斧

kafka在效率上做了很多的努力。最初的一个使用场景是处理网页上活跃的数据&#xff0c;它往往有非常大的体量&#xff0c;每个页面都能产生数十条写入。而且我们假设每条消息都会被至少一个消费者消费&#xff08;通常是多个&#xff09;&#xff0c;因此&#xff0c;我们努力让…

2 GPIO控制

ESP32的GPIO的模式&#xff0c;一共有输入和输出模式两类。其中输入模式&#xff1a;上拉输入、下拉输入、浮空输入、模拟输入&#xff1b;输出模式&#xff1a;输出模式、开漏输出&#xff08;跟stm32八种输入输出模式有所不同&#xff09;。库函数中控制引脚的函数如下&#…

如何将Hyper-V转VMware?反之亦可

为何要在Hyper-V和VMware之间进行转换呢&#xff1f; 尽管VMware和Microsoft Hyper-V都是当前流行的一类虚拟机监控程序&#xff0c;但它们并不相互兼容。VMware产品使用VMDK格式创建虚拟磁盘&#xff0c;而Hyper-V则使用VHD或VHDX格式创建虚拟磁盘。 有时您可能需要进行这种转…