【一天一大 lee】填充每个节点的下一个右侧节点指针 II (难度:中等) - Day20200928
时间:2022-07-26
本文章向大家介绍【一天一大 lee】填充每个节点的下一个右侧节点指针 II (难度:中等) - Day20200928,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:[1]
给定一个二叉树
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,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。
提示:
- 树中的节点数小于 6000
- -100 <= node.val <= 100
抛砖引玉
层次遍历
思路
广度优先遍历(BFS)
遍历中集中处理每一层的数据,注意题目中要求:
- next 指向下一个 right 节点
- 优先存在左节点
- 在处理时[a,b],a.next=b
/**
* // Definition for a Node.
* function Node(val, left, right, next) {
* this.val = val === undefined ? null : val;
* this.left = left === undefined ? null : left;
* this.right = right === undefined ? null : right;
* this.next = next === undefined ? null : next;
* };
*/
/**
* @param {Node} root
* @return {Node}
*/
var connect = function(root) {
if (root == null) return null
let queue = [root]
while (queue.length) {
let len = queue.length,
last = null
for (let i = 1; i <= len; ++i) {
let node = queue.shift()
if (node.left) queue.push(node.left)
if (node.right) queue.push(node.right)
if (i !== 1) last.next = node
last = node
}
}
return root
}
使用已建立的 next 指针
从根节点开始逐个构建下一层的 next,构建后同层借助 next 构建,同层构建完成借助 right、left 开启下一层。
var connect = function(root) {
if (root == null) return null
let start = root, // 上一层构建next的触发点
nextStart = null, // 下一轮构建next的触发点
perv = null // 上一轮后构建的节点
while (start) {
// 开启新一层时 上一轮后构建的节点修改为null
perv = null
nextStart = null
// 遍历的指针在同层节点中通过 next 连接(在遍历重来中构建了next,开启下次遍历时使用构建的next改变指针)
for (let p = start; p; p = p.next) {
// 先构建left,刷新perv 再构建right
if (p.left) helper(p.left)
if (p.right) helper(p.right)
}
// 更新触发点
start = nextStart
}
function helper(p) {
if (perv) perv.next = p
if (nextStart == null) nextStart = p
perv = p
}
return root
}
- 【自然框架】数据访问之精雕细琢(一)存储过程的参数
- 100w条记录分页,可以有多快?—— DataReader分页与SQL语句分页的对比测试(在线演示)
- Mimikatz小实验:黄金票据+dcsync
- 【自然框架】n级下拉列表框的原理
- 【自然框架】分享 n级联动下拉列表框
- GSM Hacking Part ②:使用SDR捕获GSM网络数据并解密
- 【自然框架】之数据访问 —— 再小的类库也需要设计。
- 【自然框架】之表单控件(一)实体类(Class)VS 字典(Dictionary)
- 跨平台后门Mokes现已加入OS X豪华午餐
- 【问底】严澜:数据挖掘入门——分词
- 机器学习-简单线性回归教程
- NSA(美国国安局)泄漏Exploit分析
- 详解Windows Shim的攻防利用
- 基于Github的源码白盒扫描工具Raptor
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CVE-2020-16875:Microsoft Exchange RCE复现
- 抢先学鸿蒙(HarmonyOS)2.0,你就是下一个大咖!
- Python高效编程之88条军规(2):你真的会格式化字符串吗?
- 搭建Typecho博客
- Python开发之Pandas的使用
- Python开发之numpy的使用
- flink sql实时计算当天pv写入mysql
- python爬取虎牙直播颜值区美女主播照片
- OpenCV图像处理笔记(三):霍夫变换、直方图、轮廓等综合应用
- 干货 | 高耦合场景下,Trip.com如何做支付设计与落地
- OpenCV图像处理笔记(二):图片操作进阶
- OpenCV图像处理笔记(一):图片基本操作
- BigData--Hadoop2.x新特性之HA
- 前端踩坑系列《四》
- BigData--Hadoop技术