leetcode117~Populating Next Right Pointers in Each Node II

2024-02-06 03:48

本文主要是介绍leetcode117~Populating Next Right Pointers in Each Node II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Follow up for problem “Populating Next Right Pointers in Each Node”.

What if the given tree could be any binary tree? Would your previous solution still work?

Note:

You may only use constant extra space.
For example,
Given the following binary tree,
1
/ \
2 3
/ \ \
4 5 7
After calling your function, the tree should look like:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ \
4-> 5 -> 7 -> NULL

详细的解释过程在程序中。第二种解法比较简洁~关键在于引入了一个dummyNode节点。通常来说,二叉树中引入dummyNode节点是为了使二叉树中的所有节点都是处于同一个地位的,因为这时会使dummyNode节点的指针指向头节点。

本题中引入了dummyNode节点,使pre节点每次从dummyNode节点开始进行遍历,这样dummyNode节点的next指针会始终指向每一层的最左节点,省去了在程序中对最左节点的判断和查询过程。

public class PopulatingNextRightPointers117 {

/** 思路与上题类似,同样是在遍历上层节点时,去完成下一层节点的链接过程* 不同的是,这里只是一棵普通的二叉树了。首先在确定next节点的值时,需要对左右孩子都进行判断,找到最左节点* 其次,要判断是有左孩子还是右孩子,再进行相应的链接*/public void connect(TreeLinkNode root) {if(root==null) return;TreeLinkNode parent =root;//负责对每层节点进行遍历并链接TreeLinkNode pre;;//指向每层的最左节点TreeLinkNode next;;while(parent!=null) {pre = null;next = null;//对每层节点的遍历循环while(parent!=null) {//对next赋值if(next==null) {if(parent.left!=null) {next = parent.left;} else {//不管右孩子节点是否为空next = parent.right;}}if(parent.left!=null) {if(pre!=null) {//跨父节点进行链接pre.next = parent.left;pre = pre.next;} else {pre = parent.left;}}if(parent.right!=null) {if(pre!=null) {//同一个父节点的两个孩子进行链接pre.next = parent.right;pre = pre.next;} else {pre = parent.right;}}parent = parent.next;}parent = next;}}/** 引用一个节点dummyNode,使它的next节点指向最左节点,这样就不用去判断寻找最左节点* 一般来说,dummyNode的下一节点指向头节点,这样就能使二叉树中的所有节点(包括头节点)都是一样的,因为这样使头节点有了前驱*/public void connect2(TreeLinkNode root) {if(root == null) return ;TreeLinkNode parent = root;while(parent!=null) {TreeLinkNode dummyNode = new TreeLinkNode(-1);TreeLinkNode pre = dummyNode;while(parent!=null) {if(parent.left!=null) {pre.next = parent.left;pre = parent.left;}if(parent.right!=null) {pre.next = parent.right;pre = parent.right;}parent = parent.next;}parent = dummyNode.next;}}

}

这篇关于leetcode117~Populating Next Right Pointers in Each Node II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/683049

相关文章

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件