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

5.2.2二叉树的存储结构

知识总览: 

二叉树的顺序存储:

 把二叉树上的节点连续顺序的存放

用TreeNode数组存储二叉树,TreeNode代表一个个节点,ElemType是真正存放的元素值比如1、2啥的吧?,isEmpty表示节点是否为空初始化的时候都是空,如下数组中的第一个Index没存任何节点数据,从Index=1位置上开始存正好和节点编号对应上,也可从index=0开始存储

i的父节点:i/2向下取整,完全二叉树适用

一个普通的二叉树即不是完全二叉树依次顺序存储到TreeNode数组里,数组编号/二叉树的编号已经不能反映出节点之间的关系,如下第3张图,按二叉树编号4是2的右孩子,根据2i=2*2=4编号4应该是编号2的做孩子,这些2i关系已不再适用普通二叉树,而在treeNode数组里依次存放后,左孩子2i=4也依然不再适用

解决普通二叉树不再适用完全二叉树节点编号的问题:

把普通二叉树不存在的编号写上然后再放到treeNode数组里,只是不存在的节点编号对应的Index位置存储的元素ElemType为空,isEmpty字段为true,因为如下:假设把普通二叉树不存在的节点按照完全二叉树的顺序也排布上,即虽然普通二叉树实际的节点数=8,但是按照顺序排布后认为是12个节点(最后一个节点编号是12)即n=12,当i=2时,判断i是否有左孩子2i<=n,2*2<=12条件成立但不适用,所以判断是否某个节点有左孩子要用isEmpty字段(根据视频上的讲解个人理解,可能理解有误)

采用顺序存储方式存储二叉树(普通二叉树)节点缺点:有大量空闲位置,只适用于存储完全二叉树

顺序存储即使存储普通二叉树也要把节点编号和二叉树的对应起来,即如下最后一张图一个高度为4的右子树,即使只有4个节点但是节点编号是15,也要按照顺序给不存在的节点留下空间

二叉树的链式存储:

 BiNode表示一个个节点,包括data域+2个指向左右孩子的指针,data存储节点具体的值,lchild指向左孩子的指针,rchild指向左孩子指针,没有左、右孩子lchild、rchild设置为null即可

一个节点有2个指针域,n个节点有2n个指针域,除了根节点之外,其他节点的头上总会有一个指针,即有n-1个节点头上有指针,n+1个指针会指向空节点,可以用这n+1个空链域构造线索二叉树

因为每个节点上都有2个指针,所以这种实现方式又叫二叉链表,有3个指针的叫三叉链表

代码实现:

定义一颗空树(现在还没有任何节点),申请一片空间BiNode root = (BiTree)malloc(sizeof(BiNode)),插入根节点root数据域为1root->data={1},只有根节点即左右孩子指向为null 即root->lchild = null  root->rchild=null,申请一片空间插入新节点数据域为2 BiNode *p = (BiNode *) malloc(sizeof(BiNode))[新节点是指针吗??],让根节点的左孩子指针指向P节点root->lchild=p,新节点的左右孩子指向都为空

 

三叉链表:

每个节点有指向左右孩子的指针,要找某个节点的做孩子直接找lchild指针指向的节点即可即找左右孩子容易找,找p节点的父节点即逆向找需要从根节点一个个往下找直到找到某个节点的孩子是P即找到了P节点的父节点,需要从父节点一个个遍历耗时大,因此会在BiNode链表节点上再加一个指向父节点的指针parent即三叉链表

 

知识回顾:

 

http://www.xdnf.cn/news/9634.html

相关文章:

  • 电脑软件管家 免安装便携 四十多种功能系统优化”“磁盘清理”“隐私保护
  • Windows中“无法成功完成操作,因为文件包含病毒或潜在的垃圾软件
  • 辛格迪客户案例 | 合规升级之路:辛格迪助力倍特药业迈向卓越
  • 面对 UI 差异化的调试难题:本地多设备测试中的 WebDebugX 应用实录
  • 【蓝桥杯嵌入式】【复盘】第15届省赛真题
  • Python学习(3) ----- Python的函数定义及其使用
  • OpenLayers 加载网格信息
  • [CISCN 2021初赛]glass
  • 【第2章 绘制】2.15 剪辑区
  • 【摄影教程】
  • 使用jessibuca+wvp+zlm实现html无插件播放摄像头实时画面
  • promise详细总结
  • VTK|Z轴拉伸功能的实现
  • 【Redis】通用命令
  • 使用Milvus运行一个Milvus单机版实例
  • 什么是 SRM、ERP、SCM,如何科学选型采购系统
  • 【Python】 -- 趣味代码 - 皮卡丘
  • 打造卓越客户支持体验:知识共享驱动服务优化
  • 利用openwrt路由器和随身WIFI搭建CPE
  • 世界模型:AGI突破口?一文了解NVIDIA Cosmos 平台
  • PyTorch 入门学习笔记
  • 【Python】 -- 趣味代码 - 数字游戏
  • 从 0 开始学习大模型应用开发(加餐二)- 使用Spring AI开发MCP系统
  • Java 事务管理:在分布式系统中实现可靠的数据一致性
  • Micro-CT扫描成像的样本处理与样本要求技术指南
  • 浅谈国企数字化转型
  • 2025年5月通信科技领域周报(5.19-5.25):太赫兹通信规模商用启动 空天地一体化网络加速落地
  • “从复眼到智慧”:观测云2025发布会专访—— CEO 蒋烁淼
  • Python兴趣匹配算法:从理论到实战的进阶指南
  • Echarts实现3D地图(多层geo)同步缩放