二叉树层序填充Null策略:掌握完整变量结构的还原技巧

轻宇姑娘_3067

轻宇姑娘_3067

2026-05-06

262人浏览

原创

必须填充Null才能唯一还原二叉树结构,因为无Null的层序序列无法区分左右子树缺失情况,如[1,2]可能对应左子2或右子2;带Null序列结合下标映射(左子2i+1、右子2i+2)可精确重建。

二叉树层序填充null策略:掌握完整变量结构的还原技巧

层序遍历序列中填充 Null(或占位符如 null、#、None)的目的,是保留二叉树的**结构完整性**,尤其在序列化/反序列化、LeetCode 构建测试用例、JSON 表示等场景中至关重要。仅靠原始层序序列(如 [3,9,20,15,7])无法唯一还原树形——缺少空节点信息,就无法判断某节点是否缺失左/右子,进而导致歧义。掌握“带 Null 的层序序列 → 完整二叉树结构”的还原,本质是模拟 BFS 构建过程,关键在于位置映射与空节点跳过逻辑。

为什么必须填充 Null 才能还原?

普通层序遍历(不填 Null)只输出非空节点,丢失了“空位”信息。例如两棵树:

  • Tree A:根为 1,左子为 2,右子为 null → 层序(无 Null)= [1,2]
  • Tree B:根为 1,左子为 null,右子为 2 → 层序(无 Null)= [1,2]

二者层序序列完全相同,但结构相反。只有加入 Null 占位(如 [1, null, 2] vs [1, 2, null]),才能区分左右子树是否存在。因此,带 Null 的层序序列 + 明确的顺序规则(从上到下、从左到右)可唯一确定一棵二叉树。

还原的核心策略:数组下标映射法

将带 Null 的层序序列视为一个 0-indexed 数组 vals。对任意非空节点 vals[i],其:

  • 左子节点位于 vals[2*i + 1]
  • 右子节点位于 vals[2*i + 2]

还原时按此规律逐层构建:从 i = 0 开始创建根节点,用队列缓存已创建但尚未配齐子节点的节点;每次取出队首节点 node,检查 vals[2*i+1] 和 vals[2*i+2] 是否非 Null,若是则创建对应子节点并入队;同时用计数器 i 或双指针跟踪当前处理到数组哪个位置。

实际还原步骤(以 Python 伪代码逻辑说明)

输入:列表 data = [3,9,20,null,null,15,7]

  • 若 data 为空或首项为 null,直接返回 None
  • 创建根节点 root = TreeNode(data[0]),初始化队列 queue = [root],索引 i = 0
  • 当队列非空且 i 时循环:
    • 取出 node = queue.pop(0)
    • i += 1,若 data[i] != null,创建左子 node.left = TreeNode(data[i]) 并入队
    • i += 1,若 data[i] != null,创建右子 node.right = TreeNode(data[i]) 并入队

该过程严格遵循完全二叉树的隐式数组布局,确保每个非空节点的左右子在数组中的物理位置与其逻辑父子关系一致。

常见易错点提醒

还原失败往往不是算法错,而是对输入格式理解偏差:

  • Null 表示需统一:LeetCode 多用 None 或 null 字符串,JSON 中可能是 null,编码时注意类型判断(if val is not None 而非 if val)
  • 末尾 Null 可省略:如 [1,2,3,null,null,null,null] 末尾连续 Null 通常被截断为 [1,2,3],此时不能直接套用下标公式——需以实际给出的长度为准,而非假设满二叉树大小
  • 不支持前序/后序混用:本策略仅适用于「层序 + Null 占位」输入;若给的是前序含 Null 序列(如 [1,2,null,null,3,4,null,null,5]),需改用 DFS 递归重建,逻辑完全不同
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

20

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

40

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

20

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

40

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

40

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

20

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习