Leetcode 117. 填充每个节点的下一个右侧节点指针 II

【中等】力扣算法题解析LeetCode117:填充每个节点的下一个右侧节点指针 II 题目要求填充二叉树的每个 next 指针,使其指向同层右侧节点。采用迭代法通过已建立的 next 指针进行层级遍历,满足常量空间要求。算法步骤:1)逐层处理节点;2)使用虚拟头节点 dummy 和尾指针 tail 连接下一层;3)遍历当前层时,将左右子节点链接到 tail;4)完成后切换至下一层继续处理。时间复杂度 O(N),空间复杂度 O(1)。Java 实现通过固定指针完成,高效且节省内存。 关键词:二叉树、层级遍历、next指针、常量空间、迭代法 阅读详情

题目

给定一个二叉树

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。
在这里插入图片描述
提示:

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

解法一:递归版

本题是 Leetcode 116. 填充每个节点的下一个右侧节点指针 的变种题。

在 116 题的基础上:将树的结构改变成了不完全的树。也就是说,每个非叶子结点不一定有左右孩子了。

但其实本质上还是一样的,理解下述方法:

  • findMostLeft(Node node) 方法:找到从 node 开始,找到直接孩子结点的最左结点。

有了这个方法,本题就转化为 116 题 。

不理解 116 题的同学可以看我上篇博客:Leetcode 116. 填充每个节点的下一个右侧节点指针

本题一定要注意的就是:先递归右孩子,再递归左孩子。(因为找最左孩子时需要右部分已经处理完毕。)

代码
/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}

    public Node(int _val,Node _left,Node _right,Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/
class Solution {
    public Node connect(Node root) {
        if(root == null) return null;
        
        if(root.left != null && root.right == null) {
            root.left.next = findMostLeft(root.next);
        } else if(root.left == null && root.right != null) {
            root.right.next = findMostLeft(root.next);
        } else if(root.left != null && root.right != null) {
            root.left.next = root.right;
            root.right.next = findMostLeft(root.next);
        }
        
        connect(root.right);
        connect(root.left);
        
        return root;
    }
    
    private Node findMostLeft(Node node) {
        if(node == null) return null;
        
        while(node != null) {
            if(node.left != null) return node.left;
            if(node.right != null) return node.right;
            node = node.next;
        }
        
        return null;
    }
}
结果

在这里插入图片描述

解法二:非递归版

明白了上述递归过程。非递归版就很好写了。

非递归版也与 116 题相似:Leetcode 116. 填充每个节点的下一个右侧节点指针

只需要:

  1. 从上到下处理每层的结点。
  2. 在一层结点中,按照从左到右的顺序处理所有的同层结点。
  3. 当前层处理完毕,转到下一层的最左结点继续处理。直到抵达叶子结点时结束。
代码
/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}

    public Node(int _val,Node _left,Node _right,Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/
class Solution {
    public Node connect(Node root) {
        Node pre = root;
        while(pre != null) {
            Node cur = pre;
            while(cur != null) {
                if(cur.left != null && cur.right == null) {
                    cur.left.next = findMostLeft(cur.next);
                } else if(cur.left == null && cur.right != null) {
                    cur.right.next = findMostLeft(cur.next);
                } else if(cur.left != null && cur.right != null) {
                    cur.left.next = cur.right;
                    cur.right.next = findMostLeft(cur.next);
                }
                
                cur = cur.next;
            }
            
            pre = findMostLeft(pre);
        }
        
        return root;
    }
    
    private Node findMostLeft(Node node) {
        if(node == null) return null;
        
        while(node != null) {
            if(node.left != null) return node.left;
            if(node.right != null) return node.right;
            node = node.next;
        }
        
        return null;
    }
}
结果

在这里插入图片描述

Java实现 LeetCode 117 填充每个节点的下一个右侧节点指针 II(二) 117. 填充每个节点的下一个右侧节点指针 II 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 进阶: 你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。 示例: 输入:root = [1,2,3,4,5,null,7] 输出:[1,#,2,3,#,4 立即下载

相关推荐

告别F5失灵!手把手教你为Cursor配置.Net Core控制台项目专属调试环境

本文详细指导如何在Cursor编辑器中为.Net Core控制台项目配置专属调试环境,解决F5失灵等常见问题。从调试器选择到launch.json配置,再到高级调试技巧,帮助开发者高效搭建完整的调试工具链,提升开发效率。

weixin_28834765的博客 284

leetcode【每日一题】117. 填充每个节点的下一个右侧节点指针 II Java

题干 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 进阶: 你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。 示例: 输入:root = [1,2,3,4,5,null,7] 输

qq_43491066的博客 200

Ubuntu22.04 网络图标消失与连接故障排查指南(附实战修复流程)

本文详细介绍了Ubuntu22.04系统中网络图标消失与连接故障的排查与修复方法。通过ifconfig、dhclient等命令诊断问题,提供从紧急恢复网络连接到深度排查的完整解决方案,帮助用户快速恢复网络功能并预防类似问题再次发生。

weixin_28481133的博客 287

leetcode — 117. 填充每个节点的下一个右侧节点指针 II

给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } /* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node next; public Node() {} public Node(in

柚子 283

Rocfall安装包&安装教程

Rocfall 第一步:下载安装包 下载路径: 链接:https://pan.baidu.com/s/1Dzvxzv67dSPRi7f7ZT9EeA 提取码:o9pl 第二部:安装 安装包解压 选择part1进行解压 点击Setup.exe启动安装 生成Serial Number 替换启动程序 安装完毕 素材来源于网络(禁止用于商业仅用于完成毕业设计和研究使用) 谢谢! ...

cym的博客 8693

Qoder + ADB Supabase :5分钟GET超火AI手办生图APP

本文介绍如何利用Qoder、阿里云 ADB Supabase 和通义千问图像编辑模型,快速构建AI手办生图Flutter应用。无需传统后端,通过AI生成代码、BaaS服务与边缘函数调用,实现从原型到上线的敏捷开发,全流程轻量高效,助力Vibe Coding落地实践。

数据库技术 931

leetcode_117. 填充每个节点的下一个右侧节点指针 II

给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 进阶: 你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占...

qq_37292201的博客 355

Visual Studio 2015 插件开发 从入门到放弃(一)

必需知识:C#和Visual Studio (1)安装 Visual Studio 2015 的时候选择 Visual Studio 扩展性工具(Visual Studio Extensibility Tools)。对于已经安装好 Visual Studio 2015 的小伙伴,可以找VS2015的安装包,或者在程序与功能中找VS2015双击,在VS2015界面中选择 修改,再选择

AncientPeople的博客 2万+

117. 填充每个节点的下一个右侧节点指针 II

题目 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有next 指针都被设置为 NULL。 进阶: 你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。 示例: 输入:root = [1...

qq_43808588的博客 279

Nerf 训练自有数据

colmap相机位姿转为LLFF格式数据

zfjBIT的专栏 2309

RK3588开发笔记-麦克风阵列多pdm通道合并成一个声卡

在音频设备的开发中,特别是在多通道音频数据处理场景中,如何将多个PDM(Pulse Density Modulation)通道整合成一个声卡设备,是一个非常具有挑战性的问题。RK3588芯片作为一款性能强大的平台,提供了对多个音频通道的支持。本文将介绍如何在RK3588上将多个PDM通道合并成一个麦克风阵列声卡,从而在Linux系统下统一管理和使用,提高多通道音频的同步性。在本文中我们主要介绍使用2通道回采+4通道mic声音采集构成一个6通道声卡,加以回声消除实现一个多麦克风阵列。

flypig has a dream! 1924

力扣:填充每个节点的下一个右侧节点指针 II(适合完美二叉树)

给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 进阶: 你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。 示例: 输入:root = [1,2,3,4,5,nul

K_CRACKING的博客 299

YOLO26创新改进 | 全网独家创新篇、小目标检测专属 | AAAI 2025 | 引入HS-FPN中的HFP和SDP创新点,从频域增强小目标特征,淘汰FPN进行升级,助力YOLO26有效涨点

本文提出HS-FPN特征金字塔网络,通过高频感知模块(HFP)和空间依赖感知模块(SDP)优化YOLO26模型。HFP利用高通滤波器增强小目标的高频特征,SDP捕获相邻像素的空间依赖关系。在AI-TOD等小目标检测数据集上,HS-FPN相比传统FPN显著提升性能。文章详细介绍了HFP和SDP的模块结构、核心代码实现,以及如何在YOLO26中集成这两个模块的配置方法,提供了多个版本的yaml文件配置方案。实验结果表明该方法能有效改善微小目标检测效果。

Ai缝合怪、助力小伙伴高效发论文 206

117. 填充每个节点的下一个右侧节点指针 II【 力扣(LeetCode) 】

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

yyh520025的博客 1139

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Leetcode 117. 填充每个节点的下一个右侧节点指针 II C++

Leetcode 117. 填充每个节点的下一个右侧节点指针 II 题目 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 测试样例 输入:root = [1,2,3,4,5,null,7] 输出:[1,#,2,3,#

weixin_43750513的博客 269

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LeetCode第117题_填充每个节点的下一个右侧节点指针II

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

qq_40263592的博客 1215

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LeetCode 力扣 117. 填充每个节点的下一个右侧节点指针 II

题目描述(中等难度) 给定一个二叉树,然后每个节点有一个 next 指针,将它指向它右边的节点。和 116 题 基本一样,区别在于之前是满二叉树。 解法一 BFS 直接把 116 题 题的代码复制过来就好,一句也不用改。 利用一个栈将下一层的节点保存。通过pre指针把栈里的元素一个一个接起来。 public Node connect(Node root) { if (root == ...

wind_liang的博客 919

LeetCode 117. 填充每个节点的下一个右侧节点指针 II | Python

使用层序遍历,解决LeetCode 《117. 填充每个节点的下一个右侧节点指针 II》 问题

"大梦三千秋的博客 487

LeetCode 117:填充每个节点的下一个右侧节点指针 II

目录LeetCode题目描述解题 LeetCode 题目描述 解题      填充每个节点的下一个右侧节点指针 II /* // Definition for a Node. class Node { public: int val; Node* left; Node* right; Node* next; Node() : val(0), left(NULL), right(NULL), next(NULL) {} Node(int _val) : va

s_Shune 237

leetcode 117. 填充每个节点的下一个右侧节点指针 II

117. 填充每个节点的下一个右侧节点指针 II 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 进阶: 你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。 示例: 输入:root =

Qin_酱的博客 285

leetcode117. 填充每个节点的下一个右侧节点指针 II/层次遍历

文章目录题目:117. 填充每个节点的下一个右侧节点指针 II基本思想1:层次遍历基本思想2:层次遍历(进阶) 题目:117. 填充每个节点的下一个右侧节点指针 II 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 进

yyf_blog 281

LeetCode 117. 填充每个节点的下一个右侧节点指针 II(Java代码)

下次碰到链表题目,不偷懒,一定画图。脑袋抽象疯了。。。

r'q'x't 的博客 256

LeetCode刷题记94-117. 填充每个节点的下一个右侧节点指针 II【再做一遍】

LeetCode刷题记94 117. 填充每个节点的下一个右侧节点指针 II 题目 /* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node next; public Node() {} public Node(int _val) { val = _val; }

weixin_44013557的博客 108

算法学习——LeetCode力扣二叉树篇3(116. 填充每个节点的下一个右侧节点指针、117. 填充每个节点的下一个右侧节点指针 II、104. 二叉树的最大深度、111. 二叉树的最小深度)

算法学习——LeetCode力扣二叉树篇3(116. 填充每个节点的下一个右侧节点指针、117. 填充每个节点的下一个右侧节点指针 II、104. 二叉树的最大深度、111. 二叉树的最小深度)

拉依达不拉跨的博客 1136

LeetCode 117. 填充每个节点的下一个右侧节点指针 II

LeetCode 117. 填充每个节点的下一个右侧节点指针 II 题目 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被设置为 NULL。 进...

Ailecccc的博客 240
上一篇: Leetcode 116. 填充每个节点的下一个右侧节点指针
下一篇: Leetcode 124. 二叉树中的最大路径和
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值