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

相关文章

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

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