通俗算法讲解推荐阅读:
【算法–链表】83.删除排序链表中的重复元素–通俗讲解
【算法–链表】删除排序链表中的重复元素 II–通俗讲解
【算法–链表】86.分割链表–通俗讲解
【算法】92.翻转链表Ⅱ–通俗讲解
【算法–链表】109.有序链表转换二叉搜索树–通俗讲解
【算法–链表】114.二叉树展开为链表–通俗讲解
【算法–链表】116.填充每个节点的下一个右侧节点指针–通俗讲解


通俗易懂讲解“填充每个节点的下一个右侧节点指针Ⅱ”算法题目

一、题目是啥?一句话说清

给定一个二叉树,填充每个节点的next指针,使其指向同一层的下一个右侧节点;如果找不到下一个节点,则next指针为NULL。初始时所有next指针都是NULL。

示例:

  • 输入:二叉树(可能不完整,即不是满二叉树)
  • 输出:二叉树 with next pointers filled

二、解题核心

使用层次遍历,但不需要使用队列,而是利用已建立的next指针来遍历下一层。我们使用一个虚拟节点(dummy)来帮助构建下一层的链表,然后用当前层的next指针来访问所有节点,同时连接下一层的节点。

这就像在每一层中,我们有一个链表,我们遍历这个链表来处理每个节点,同时将它们的子节点连接到下一层的链表中,从而节省空间。

三、关键在哪里?(3个核心点)

想理解并解决这道题,必须抓住以下三个关键点:

1. 利用当前层的next指针遍历

  • 是什么:从根节点开始,当前层已经通过next指针连接起来,所以我们可以像遍历链表一样遍历当前层。
  • 为什么重要:这样可以避免使用队列,节省空间。我们不需要存储所有节点,只需要几个指针。

2. 构建下一层的链表

  • 是什么:在处理当前层的每个节点时,我们将它的左子节点和右子节点依次添加到下一层的链表中。使用一个tail指针来维护下一层链表的尾部。
  • 为什么重要:这样我们可以按顺序连接下一层的节点,为下一层的遍历做准备,并保持节点的顺序。

3. 虚拟节点(Dummy Node)的运用

  • 是什么:为下一层创建一个虚拟头节点,这样我们可以轻松地访问下一层的头节点。
  • 为什么重要:虚拟节点简化了链表操作,避免了处理空链表的情况。当下一层没有节点时,虚拟节点的next为NULL,我们可以停止循环。

四、看图理解流程(通俗理解版本)

假设我们有这样一个二叉树:

        1/ \2   3/ \   \4   5   7

我们需要填充next指针。

  1. 初始化:从根节点开始,当前current指向节点1。
  2. 第一层处理
    • 创建虚拟节点dummytail指向dummy
    • 遍历当前层(只有节点1):
      • 节点1有左子节点2:将tail.next指向节点2,tail移动到节点2。
      • 节点1有右子节点3:将tail.next指向节点3,tail移动到节点3。
    • 当前层遍历完后,current设置为dummy.next(即节点2)。
  3. 第二层处理
    • 当前current指向节点2(第二层的头)。
    • 创建新的虚拟节点dummytail指向dummy
    • 遍历当前层(节点2和节点3通过next连接):
      • 节点2有左子节点4:tail.next指向节点4,tail移动到节点4。
      • 节点2有右子节点5:tail.next指向节点5,tail移动到节点5。
      • 节点3有右子节点7:tail.next指向节点7,tail移动到节点7。
    • 当前层遍历完后,current设置为dummy.next(即节点4)。
  4. 第三层处理
    • 当前current指向节点4(第三层的头)。
    • 创建虚拟节点dummytail指向dummy
    • 遍历当前层(节点4、5、7通过next连接):
      • 节点4没有子节点,跳过。
      • 节点5没有子节点,跳过。
      • 节点7没有子节点,跳过。
    • 下一层为空,循环结束。

最终next指针:

  • 节点1的next为NULL。
  • 节点2的next指向节点3。
  • 节点3的next为NULL。
  • 节点4的next指向节点5。
  • 节点5的next指向节点7。
  • 节点7的next为NULL。

五、C++ 代码实现(附详细注释)

#include <iostream>
using namespace std;// 二叉树节点定义
class Node {
public:

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分词器(Tokenizer)总结(89)

分词器(Tokenizer)总结 分词器(Tokenizer) 分词器的词表(vocabulary)长度通常短于模型嵌入层(embedding layer)的长度。 结束标记(EOS token)应仅用于标记文本结尾,不可用于其他用途。 填充标记(PAD token)通常未预先定义,但你仍可能需要用到它: 对于生成式模型…

19 webUI应用中 Controlnet精讲(05)-图像修复与编辑

前面的篇章已经详细讲解了线条约束、三维关系与空间深度、人体姿态等几类controlnet的功能与应用&#xff0c;本节内容将对通过controlnet对图像修复与编辑进行讲解。 通过controlnet也可以对图片进行编辑、重绘及放大等操作&#xff0c;具体包括Recolor、Inpaint、Tile等&…

消息推送的三种常见方式:轮询、SSE、WebSocket

摘要&#xff1a;本文介绍消息推送的三种常见方式&#xff1a;轮询&#xff08;定时请求&#xff0c;易增负担&#xff09;与长轮询&#xff08;阻塞请求至有数据 / 超时&#xff0c;减少请求&#xff09;、SSE&#xff08;HTTP 单向实时传输&#xff0c;纯文本、自动重连&…

论文阅读:ACL 2024 Stealthy Attack on Large Language Model based Recommendation

总目录 大模型相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://arxiv.org/pdf/2402.14836 https://www.doubao.com/chat/19815566713551106 文章目录速览攻击方法速览一、攻击核心目标与前提1. 核心目标2. 攻击前提二、模型无关的简单…

自动驾驶中的传感器技术43——Radar(4)

本文对目前毫米波雷达中的天线设计进行比较全面的罗列&#xff0c;并进行简单的设计评述 1、实际设计案例 图1 涵盖能宽窄覆盖的天线设计&#xff08;无俯仰分辨率&#xff09;图2 Bosch前雷达的天线设计&#xff08;有俯仰的分辨率但比较弱&#xff0c;也涵盖了扩展覆盖&…

使用反转法线材质球,实现切换天空盒相同的功能,优点:包体变小

切换天空盒第一步先把SKY 天空球资源导入到工程里&#xff0c; 第二步&#xff1a;天空球文件下的SKY预制件拖入到场景里 第三步 选着SKY材质球&#xff0c;拖入自己的全景图片(图片分辨率不能超过5000*5000&#xff0c;否则手机无法显示) 如果并没有效果&#xff0c;看看图…

真正有效的数据指标体系应该长什么样?

真正有效的数据指标体系应该长什么样&#xff1f;为什么大多数企业的指标体系都是"花架子"&#xff1f;真正有效的指标体系应该长什么样&#xff1f;从数据到洞察&#xff1a;让指标真正"活"起来结语在这个人人都在谈数字化转型的时代&#xff0c;企业就像…

分布式专题——6 Redis缓存设计与性能优化

1 多级缓存架构2 缓存设计 2.1 缓存穿透 2.1.1 简介缓存穿透是什么&#xff1f;当查询一个根本不存在的数据时&#xff0c;缓存层和存储层都不会命中。正常逻辑下&#xff0c;存储层查不到数据就不会写入缓存层。这会导致&#xff1a;每次请求这个不存在的数据&#xff0c;都要…

一文了解大模型压缩与部署

一文了解大模型压缩与部署&#xff1a;从 INT4 量化到 MoE&#xff0c;让大模型跑在手机、边缘设备和云端&#x1f3af; 为什么需要模型压缩与部署&#xff1f;你训练了一个强大的大模型&#xff08;如 Qwen-72B、LLaMA-3-70B&#xff09;&#xff0c;但在部署时发现&#xff1…

新手向:中文语言识别的进化之路

自然语言处理&#xff08;NLP&#xff09;技术正在以前所未有的速度改变我们与机器的交互方式。根据Gartner最新报告显示&#xff0c;全球NLP市场规模预计在2025年将达到430亿美元&#xff0c;年复合增长率高达21%。而中文作为世界上使用人数最多的语言&#xff08;全球约15亿使…

LeetCode100-206反转链表

本文基于各个大佬的文章上点关注下点赞&#xff0c;明天一定更灿烂&#xff01;前言Python基础好像会了又好像没会&#xff0c;所有我直接开始刷leetcode一边抄样例代码一边学习吧。本系列文章用来记录学习中的思考&#xff0c;写给自己看的&#xff0c;也欢迎大家在评论区指导…

uniapp开源多商户小程序商城平台源码 支持二次开发+永久免费升级

在电商行业竞争日益激烈的今天&#xff0c;拥有一个功能强大、灵活可拓展的多商户小程序商城至关重要。今天给大家分享一款 uniapp 开源多商户小程序商城平台源码&#xff0c;它不仅具备丰富的基础功能&#xff0c;还支持二次开发&#xff0c;更能享受永久免费升级服务&#xf…

使用脚本一键更新NTP服务器地址为自定义地址

【使用场景】 在银河麒麟桌面操作系统V10SP1-2303版本中使用脚本一键修改NTP服务器地址为自定义地址。 【操作步骤】 步骤1. 编写shell脚本 ```bash desktop2303@desktop2303-pc:~$ vim setntptimeserver.sh #!/bin/bashfunction modifykylinconf() { # 检查是否已存在目标配置…

linux内核 - 内核架构概览

当 Linux 系统启动时,内核会在启动过程的早期阶段接管控制——紧跟在固件(BIOS 或 UEFI)和引导加载程序完成任务之后。此时,压缩的 Linux 内核镜像会被加载到内存中,通常会附带一个称为 initramfs 的最小临时根文件系统,它用于在切换到真实根文件系统并继续系统初始化之前…

[react] react-router-dom是啥?

页面路由&#xff0c;注意页面路由不是路由器&#xff0c;因为我之前总是把路由和路由器搞混。而且我总是把前端页面的路由和路由器的路由搞混。那么这里一定要明白&#xff0c;这里我所说的页面路由就是指在浏览器里面的导航路由。 npm create vitelatest my-react-app – --t…

HTTP简易客户端实现

&#x1f310; HTTP简易客户端实现 流程图&#xff1a; 引用&#xff1a; chnroutes2.cpp#L474 chnroutes2_getiplist() chnroutes2.cpp#L443 http_easy_get(…) &#x1f552; 1. 超时管理机制 (http_easy_timeout) &#x1f539; 核心功能&#xff1a;创建定时器自动关…

建筑面LAS点云高度计算工具

效果 例如中位数,计算后,在shp建筑面中添加一个字段meidian_hei 准备数据 1、建筑矢量面.shp 2、点云.las 界面 脚本 import laspy import shapefile # pyshp库,处理POLYGONZ坐标格式异常 import pandas as pd import numpy as np import os import traceback # 打印…

java day18

继续学习&#xff0c;学习sringboot案例&#xff1b;熟悉的三件套&#xff1b;比如做一个表&#xff0c;前端搭建好框架&#xff0c;然后返回给后端一个请求&#xff0c;说要这个表的数据吧&#xff1b;然后通过请求和规定的格式返回给后端之后&#xff0c;我们后端进行接收处理…

并发编程原理与实战(二十八)深入无锁并发演进,AtomicInteger核心API详解与典型场景举例

无锁并发演进背景 随着系统高并发的压力越来越大&#xff0c;传统同步机制在高并发场景下的性能瓶颈和缺点可能会逐渐显露&#xff1a; &#xff08;1&#xff09;性能损耗&#xff1a;synchronized等锁机制会导致线程阻塞和上下文切换&#xff0c;在高并发场景下性能损耗显著。…

整体设计 之 绪 思维导图引擎 之 引 认知系统 之 引 认知系统 之 序 认知元架构 之5 : Class 的uml profile(豆包助手 之7)

摘要&#xff08;AI生成&#xff09;三层中间件架构的约束逻辑体系1. 架构定位与功能分工三个中间层&#xff08;隔离层/隐藏层/防腐层&#xff09;构成数据处理管道&#xff0c;分别承担&#xff1a;隔离层&#xff1a;跨系统数据转换处理对象&#xff1a;异构数据&#xff08…