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

news2025/1/4 17:11:26

文章目录

      • 1. 背
      • 2. 题目
      • 3. 答案

1. 背

在这里插入图片描述
这道题本来可以很简答,一个队列,存储指针和它的行数就OK了,但是这道题的难点在于不用额外空间复杂度。
横向看一下,这一行是不是就是一个链表呢?
多加一个变量,用来存储第一有有效节点,什么是有效节点呢?就是左右节点中至少有一个不为空的。这个节点为啥不存第一个节点呢?而是存第一个有效节点呢?其实对于这一行来说是没有区别的,但是对于下一行的使用是有区别的。
下面介绍第二个变量,叫做pre,每次遍历一个节点,都是让pre的next指向当前节点。既然这样,pre的默认值是无意义的。因为pre的next才是第一个有效节点。

2. 题目

给定一个二叉树

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

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

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

3. 答案

/*
// 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) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        auto lastList = root;///<第一个有效节点
        while(nullptr!=lastList)
        {
            auto node = lastList;
            Node preNode(-1);
            auto pre = &preNode;///<所有的赋值都是从pre开始的,因此第一个pre是无效的。
            while(nullptr!=node)//遍历链表
            {
                if(node->left!=nullptr)
                {
                    pre->next = node->left;
                    pre = pre->next;
                }
                if(node->right!=nullptr)//<这里没用else if就很灵性,因为遍历是以节点为单位的,但是left还有可能要指向right
                {
                    pre->next = node->right;
                    pre = pre->next;
                }
                node = node->next;
            }
            
            /*寻找下一个有效节点*/
            while(lastList!=nullptr && lastList->left==nullptr && lastList->right==nullptr)
                lastList = lastList->next;
            if(lastList==nullptr)
                break;
            lastList = lastList->left==nullptr ? lastList->right:lastList->left;
        }
        return root;
    }
};

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

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

相关文章

C++入门教程||C++ 判断||C++ 日期 时间

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 下面是大多数编程语言中典型的判断结构的一般形式&#xff1a; 判断语句 C 编程语言提…

three.js实战 -自定义剪切器

1. 前言 这是我在github上看到大佬的一个作品&#xff0c;当时感觉很有意思&#xff0c;决定分享出来&#xff0c;不知道取这个名字是否正确&#xff0c;废话不多说看下面效果。 2.demo效果 3.需要掌握的知识 矩阵的基本运算&#xff0c;能够认是到一些基本变换用到的矩阵(…

晶圆级倒装装备及控制系统

晶圆级倒装装备主要由晶圆盘进料模块、晶圆盘工作台模块、覆晶模块、焊头模块、基板工作台模块、点胶模块、视觉模块和基板进出料模块组成&#xff0c;如图 2-2 所示。 晶圆级倒装装备控制系统结构晶圆级倒装装备的运控系统主要由工控机、运动控制卡、驱动器、反馈装置和直线电…

QA:observable and Subject

概念区别和常见的错误理解辩证&#xff1a; 通俗理解一下 1. Observable 是一条 "水管蓝图" ,每次打开水龙头&#xff0c;水流会按照设计好的路线流向终点。起点和终点一一对应。每次打开水流&#xff0c;都是新的流&#xff0c;水流之间互不影响。一次一管。 2. …

VMWare虚拟机设置CentOS7共享文件夹

1. 目录 系统版本&#xff1a;CentOS 7.9 文章目录1. 目录2. VMWare&#xff1a;虚拟机设置&#xff0c;设置共享文件夹3. 虚拟机设置&#xff1a;手动挂载共享文件夹4. 检查是否挂载成功5. (可选)创建共享文件夹的软链接(快捷方式)6. (可选)定时任务开机自动挂载2. VMWare&am…

博客文章分类导引(持续更新)

摘要&#xff1a;本文提供一篇博客目录&#xff0c;有物联网、安卓编程、硬件设计等若干主题&#xff0c;这些主题一般都是成系统的&#xff0c;可以实现从零开始做出自己的物联网系统。 文章结构如下&#xff1a; 1.物联网专栏 使用arduino编写mqtt客户端连接emqx服务器 VSC…

vue.js:组件化的实现和使用过程

什么是组件化&#xff1f; 当我们遇到复杂问题的时候&#xff1a; 任何一个人处理信息的逻辑能力都是有限的所以&#xff0c;当我们面对一个复杂的问题的时候&#xff0c;我们不可能一次性搞定处理掉一大堆内容但是我们都会有问题拆解的能力将一个复杂的问题拆解成很多小的问…

Springcloud笔记之Ribbon

Ribbon&#xff1a;负载均衡&#xff08;基于客户端&#xff09;1. 负载均衡以及Ribbon1.1 Ribbon 的概念1.2 Ribbon 的作用2. 集成Ribbon3. 使用Ribbon实现负载均衡3.1 步骤3.2 自定义规则1. 负载均衡以及Ribbon 1.1 Ribbon 的概念 Spring Cloud Ribbon 是基于Netflix Ribbo…

[附源码]计算机毕业设计JAVA智能超市导购系统

[附源码]计算机毕业设计JAVA智能超市导购系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

WebRTC Native M96 回调音频裸数据IAudioFrameObserver--采集的音频(onRecordAudioFrame)

上篇已经说道,通过注册回调,给上层APP抛音频裸数据: 《WebRTC Native M96 SDK接口封装–注册语音观测器对象获取原始音频数据registerAudioFrameObserver》[https://dabaojian.blog.csdn.net/article/details/128218542] 此篇,就详细讲述一下,如果实现onRecordAudioFrame…

vue学习笔记(二)-vue生命周期

概念 a.又名生命周期回调函数、生命周期函数、生命周期钩子b.是什么&#xff1a;Vue在关键时刻帮我们调用的一些特殊名称的函数c.生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求编写的d.生命周期函数中的 this 指向是vm或组件实例对象 示例代码&am…

来一场关于元宇宙可持续的灵魂辩论|BOOK DAO 内容共建 第6期 招募

小杜《元宇宙创意图谱》是 BOOK DAO 的共建书籍项目&#xff0c;12.03我们举行了虚拟时尚主题的第5次公开共建活动。本周六晚8点&#xff0c;我们将举办第6期 元宇宙可持续 专题的共建活动。BOOK DAO 以搭建产业界与用户之间的交流平台、挖掘业界最值得深入探讨研究的话题为目标…

【linux】ssh免密登录

概要 服务器免密登录实际上是基于公钥的认证&#xff0c;比如希望A服务器可以免密访问B服务器&#xff0c;则需要进行如下步骤 A服务器生成密钥对将A服务器生成的公钥分发到B服务器&#xff08;写入~/.ssh/authorized_keys&#xff09;A服务器即可免密登录B服务器 生成密钥对…

特殊类的设计(单类模式)

一.不能拷贝的类 首先要知道拷贝的场景&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 方法1&#xff1a;将这两个函数只声明&#xff0c;不定义&#xff08;防止编译器默…

【愚公系列】2022年12月 Redis数据库-Cache和Redis缓存的无缝切换使用

文章目录前言一、Cache和Redis缓存的无缝切换使用1.安装包2.服务配置3.创建控制器4.启动程序前言 Redis是分布式缓存&#xff0c;是将数据随机分配到不同服务器的&#xff0c;catch属于单机缓存&#xff0c;只能本机访问。 Redis和Cache的区别吧 Redis和cache都是将数据存放…

Nginx rewrite 详解

Nginx rewrite 详解 本篇主要介绍 nginx 的 rewrite 重定向这个功能进行 详解介绍, 以及介绍它的使用场景 1. rewrite 基本介绍 rewrite是实现URL重写的关键指令&#xff0c;根据regex (正则表达式)部分内容,重定向到replacement&#xff0c;结尾是flag标记。 基本语法: re…

JAVA SCRIPT设计模式--结构型--设计模式之Decorator装饰模式(9)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能&#xff0c;所以不可能像C&#xff0c;JAVA等面向对象语言一样严谨&#xff0c;大部分程序都附上了JAVA SCRIPT代码&#xff0c;代码只是实现了设计模式的主体功能&#xff0c;不代…

JSP ssh房地产项目管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh房地产项目管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7…

吉林省教育学院学报杂志社吉林省教育学院学报编辑部2022年第11期目录

特稿 高职院校思政课“一体两翼四融合”教学模式的构建探索——以吉林工业职业技术学院为例 杨宝忠;解静; 1-5 高校业财融合体系研究 朱延辉; 6-9 教育理论与管理《吉林教育学院学报》投稿&#xff1a;cn7kantougao163.com 新教育评价改革背景下幼儿园教师评价能力…

pikachu-xss部分速通

pikachu-xss部分速通 &#x1f349; &#x1f349;目录pikachu-xss部分速通反射型xss(get)反射性xss(post)存储型xssDOM型xss、DOM型xss-xxss盲打xss之过滤xss之htmlspecialcharsxss之href输出xss之js输出反射型xss(get) payload: </p><script>alert(1)</scr…