当前位置: 首页 > news >正文

数据库(6)

目录

树和森林

一、二叉树还原为森林

二、树和森林的存储方式

1、双亲表示法

2、孩子表示法

3、孩子兄弟表示法

4、总结

三、关系结构图

树和森林

一、二叉树还原为森林

方法:把最右边的子树变为一棵树,其余右子树为兄弟

二叉树还原为森林的核心是拆分 “右指针串联” 的根节点,并将每棵子二叉树还原为普通树。具体步骤基于森林转二叉树的逆过程:

1、拆分根节点的右子树:从二叉树的根节点开始,沿右指针依次拆分出所有 “子根节点”(每个子根对应原森林中一棵树的根)。例如,若二叉树根节点 A 的右指针指向 E,E 的右指针指向 F,则拆分出 A、E、F 三个子根,分别对应森林中的三棵树。

2、单棵二叉树还原为普通树:对每个拆分出的子根对应的二叉树,按 “左孩子为原树孩子,右孩子为原树兄弟” 的规则还原:

(1)节点的左子树保留为原树的 “第一个孩子”;

(2)节点的右子树(及右子树的右子树)均视为原节点的 “兄弟”,需将这些右子树节点转为原节点的直接兄弟(即同一父节点的孩子)。

3、所有还原后的普通树共同组成原森林。

二、树和森林的存储方式

1、双亲表示法

定义:以 “节点 - 父节点” 的映射关系存储树或森林,每个节点记录其双亲(父节点)的位置,根节点的双亲标记为特殊值(如 - 1)。

结构设计

  • 用数组存储所有节点,每个元素包含两部分:节点值、父节点索引(数组下标)。

  • 示例(树结构:A 是根,孩子 B、C;B 的孩子 D):

    索引节点值父节点索引
    0A-1(根)
    1B0(父为 A)
    2C0(父为 A)
    3D1(父为 B)

特点

  • 优点:查询节点的双亲效率高(O (1)),适合 “向上追溯” 场景(如找祖先)。
  • 缺点:查询节点的孩子需遍历整个数组(O (n)),不适合频繁访问孩子的操作。
  • 适用场景:森林(多棵树)存储(只需为每棵树根节点标记父节点为 - 1),或需频繁查找父节点的场景。

2、孩子表示法

定义:以 “节点 - 孩子列表” 的映射关系存储树或森林,每个节点记录其所有直接孩子的位置,形成 “父节点指向孩子集合” 的结构。

结构设计

  • 主数组存储所有节点,每个元素包含:节点值、指向孩子链表的指针。

  • 孩子链表:每个节点的所有直接孩子按顺序组成链表(便于动态增删孩子)。

  • 示例(同上树结构):

    主数组:
    [A -> [B, C],  B -> [D],  C -> [],  D -> []]
    (A的孩子链表为B→C,B的孩子链表为D,C和D无孩子)
    

特点

  • 优点:查询节点的所有孩子效率高(直接遍历链表),适合 “向下访问” 场景(如遍历子树)。
  • 缺点:查询节点的双亲需遍历所有节点的孩子链表(O (n)),结构较复杂(需维护数组和链表)。
  • 适用场景:单棵树或森林中需频繁访问孩子的场景(如树的层次遍历)。

3、孩子兄弟表示法

定义:又称 “二叉树表示法”,通过二叉树的结构存储树或森林:每个节点包含三个部分 —— 节点值、指向第一个孩子的指针(左指针)、指向第一个兄弟的指针(右指针)。

结构设计

  • 节点 =(值,左孩子指针,右兄弟指针)。
  • 规则:
    • 左指针:指向节点的第一个直接孩子;
    • 右指针:指向节点的下一个兄弟节点(同一父节点的其他孩子)。
  • 示例(同上树结构):

    A的左指针→B(第一个孩子),A的右指针→null(无兄弟);  
    B的左指针→D(第一个孩子),B的右指针→C(下一个兄弟);  
    C的左指针→null,C的右指针→null;  
    D的左指针→null,D的右指针→null。  
    

特点

  • 优点:结构简洁(仅用两个指针),可直接复用二叉树的操作算法(如遍历、插入),同时支持树和森林的存储(森林可通过根节点的右指针串联,如森林中树 T1 的根右指针→T2 的根)。
  • 缺点:理解较抽象(右指针表示兄弟而非右孩子),查询节点的所有兄弟需沿右指针遍历。
  • 适用场景:树与二叉树的转化(核心存储方式)、需统一树和森林操作逻辑的场景(如编译器的语法树)。

4、总结

三种存储方式各有侧重:

  • 双亲表示法:高效查父,适合向上追溯;
  • 孩子表示法:高效查子,适合向下遍历;
  • 孩子兄弟表示法:结构灵活,是树与二叉树转化的桥梁,适用范围最广。实际应用中需根据操作需求(查父 / 查子 / 转化)选择合适的存储方式。

三、关系结构图

http://www.dtcms.com/a/516449.html

相关文章:

  • 【性能优化】--perfetto分析思路
  • **发散创新:探索生物神经网络与编程语言的交融**随着生物神经网络研
  • 平台网站开发公司广州安全教育平台登陆
  • 第1章:初识Linux系统——第8节:查看/修改权限控制和ACL
  • Rust所有权机制在Web服务开发中的避坑指南
  • 成都网站开发费用企业网站建设任务书
  • pyhton 螺旋矩阵(指针-矩阵-中等)含源码(二十六)
  • 矩阵的奇异值分解(SVD)在三维图形学中的进阶应用
  • 装饰器加强
  • 17Z一起做网站广州站南阳商都网站做网站
  • MySQL多实例部署实战指南
  • 微网站建设招聘做招聘网站代理商需要多少钱
  • Android 网络变动监听
  • Deep Metric Learning(深度度量学习)
  • 消息队列RabbitMQ、Kafka、ActiveMQ 、Redis、 ZeroMQ、Apache Pulsar对比和如何使用
  • 建网站专用网站标准物质网站建设模板
  • (四)Flutter插件之IOS插件开发
  • 湘潭网站建设 x磐石网络广州网站建设培训学校
  • 织梦做的网站老是被黑国外做美食视频网站有哪些
  • 自动化测试相关使用
  • 做移门图的 网站有哪些做招聘网站需要做什么公司
  • TDengine 数字函数 RADIANS 用户手册
  • 做导航网站赚钱企业网站搜索优化外
  • 网站网页设计公司海南省建设执业中心网站
  • 如何解压一个MacOs PKG 安装包修改内容后重新打包
  • Linux 与 Windows:谁更适合 CLI 模式 AI 编程工具?
  • 深度学习(15)-PyTorch torch.nn 参考手册
  • 人工智能Pytorch开发环境的搭建
  • 【研究生随笔】Pytorch中的多层感知机
  • 广州知名网站建设性价比高三乡网站建设公司