populating-next-right-pointers-in-each-node-ii

2024-05-02 02:48

本文主要是介绍populating-next-right-pointers-in-each-node-ii,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、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    7After calling your function, the tree should look like:1 -> NULL/  \2 -> 3 -> NULL/ \    \4-> 5 -> 7 -> NULL

2、思路:

  • 代码1思路,采用队列,对于每一层的元素,遍历时,用一个临时的结点cur放置当前poll出来的结点,poll后,检查当前队列的对头是否是该层元素,若是用cur指向就可以了;
  • 代码2思路,不使用队列(题目说是You may only use constant extra space)。首先不使用队列的情况下我们要遍历整个树,就得利用它每一层都有一条链,有链就可以通过一个结点遍历一层了。这里通过新建头部结点tmpLevelFirst(该结点本身的值和树没关系,只有tmpLevelFirst.next来指向每一层的头结点)来实现

3、代码1,用队列辅助实现:

public class BFSConnectTree {public void connect(TreeLinkNode root) {if(root == null)return;Queue<TreeLinkNode> queue = new LinkedList<TreeLinkNode>();queue.add(root);TreeLinkNode node = new TreeLinkNode(0);while(!queue.isEmpty()){int broad_size  = queue.size();//每一层 的节点数目for(int i = 0; i < broad_size; i++){node = queue.poll();if(i == broad_size - 1){//若是当前层的最后一个元素手动指向nullnode.next = null;}else{node.next = queue.peek();}if(node.left != null)queue.add(node.left);if(node.right != null)queue.add(node.right);}}}}

代码2,利用每层都是链的特点实现:

public class BFSConnectTreeWithoutSpace {public void connect(TreeLinkNode root) {while (root != null) {//tmpLevelFirst为新建立的每层第一个节点(为了方便后面遍历当前行节点)TreeLinkNode tmpLevelFirst = new TreeLinkNode(0);TreeLinkNode cur = tmpLevelFirst;while (root != null) {if (root.left != null) {cur.next = root.left;cur = cur.next;}if (root.right != null) {cur.next = root.right;cur = cur.next;}root = root.next;}root = tmpLevelFirst.next;}}
}

注:代码和思路都参考了上面链接中的答案,非常感谢那些大佬

这篇关于populating-next-right-pointers-in-each-node-ii的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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、路由模块添加前缀 四、中间件

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

Node Linux相关安装

下载经编译好的文件cd /optwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gztar -xvf node-v10.15.3-linux-x64.tar.gzln -s /opt/node-v10.15.3-linux-x64/bin/npm /usr/local/bin/ln -s /opt/nod