二叉树的存储

1.顺序存储结构

所谓二叉树的顺序存储,就是用一组连续的存储单元存放二叉树中的结点。一般是按照二叉树结点从上至下、从左到右的顺序存储。

这样结点在存储位置上的前驱后继关系并不一定就是它们在逻辑上的邻接关系,然而只有通过一些方法确定某结点在逻辑上的前驱结点和后继结点,这种存储才有意义。因此,依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系,这样既能够最大可能地节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。图6.4 给出的图6.3(a)所示的完全二叉树的顺序存储示意图。

对于一般的二叉树,如果仍按从上至下和从左到右的顺序将树中的结点顺序存储在一维数组中,则数组元素下标之间的关系不能够反映二叉树中结点之间的逻辑关系,只有增添一些并不存在的空结点,使之成为一棵完全二叉树的形式,然后再用一维数组顺序存储。

如图6.5 给出了一棵一般二叉树改造后的完全二叉树形态和其顺序存储状态示意图。显然,这种存储对于需增加许多空结点才能将一棵二叉树改造成为一棵完全二叉树的存储时,会造成空间的大量浪费,不宜用顺序存储结构。最坏的情况是右单支树,如图6.6 所示,一棵深度为k 的右单支树,只有k 个结点,却需分配2k-1 个存储单元。

(c) 单支树改造后完全二叉树的顺序存储状态图6.6 右单支二叉树及其顺序存储示意图二叉树的顺序存储表示可描述为:

1 #define MAXNODE /*二叉树的最大结点数*/
2 typedef elemtype SqBiTree[MAXNODE] /*0 号单元存放根结点*/
3 SqBiTree bt;

即将bt 定义为含有MAXNODE 个elemtype 类型元素的一维数组。

2.链式存储结构

所谓二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示着元素的逻辑关系。通常有下面两种形式。

(1)二叉链表存储

链表中每个结点由三个域组成,除了数据域外,还有两个指针域,分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。结点的存储的结构为:

其中,data 域存放某结点的数据信息;lchild 与rchild 分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL 表示)。

图6.7(a)给出了图6.3(b)所示的一棵二叉树的二叉链表示。二叉链表也可以带头结点的方式存放,如图6.7(b)所示。

(2)三叉链表存储

每个结点由四个域组成,具体结构为:

其中,data、lchild 以及rchild 三个域的意义同二叉链表结构;parent 域为指向该结点双亲结点的指针。这种存储结构既便于查找孩子结点,又便于查找双亲结点;但是,相对于二叉链表存储结构而言,它增加了空间开销。图6.8 给出了图6.3(b)所示的一棵二叉树的三叉链表示。

尽管在二叉链表中无法由结点直接找到其双亲,但由于二叉链表结构灵活,操作方便,对于一般情况的二叉树,甚至比顺序存储结构还节省空间。因此,二叉链表是最常用的二叉树存储方式。本书后面所涉及到的二叉树的链式存储结构不加特别说明的都是指二叉链表结构。

二叉树的二叉链表存储表示可描述为:

1 typedef struct BiTNode
2 {
3     elemtype data;
4     struct BiTNode *lchild;*rchild; /*左右孩子指针*/
5 }BiTNode,*BiTree;

即将BiTree 定义为指向二叉链表结点结构的指针类型。

二叉树的基本操作及实现

1.二叉树的基本操作

二叉树的基本操作通常有以下几种:
(1)Initiate(bt)建立一棵空二叉树。
(2)Create(x,lbt,rbt)生成一棵以x 为根结点的数据域信息,以二叉树lbt 和rbt为左子树和右子树的二叉树。
(3)InsertL(bt,x,parent)将数据域信息为x 的结点插入到二叉树bt 中作为结点parent 的左孩子结点。如果结点parent 原来有左孩子结点,则将结点parent 原来的左孩子结点作为结点x 的左孩子结点。
(4)InsertR(bt,x,parent)将数据域信息为x 的结点插入到二叉树bt 中作为结点parent 的右孩子结点。如果结点parent 原来有右孩子结点,则将结点parent 原来的右孩子结点作为结点x 的右孩子结点。
(5)DeleteL(bt,parent)在二叉树bt 中删除结点parent 的左子树。
(6)DeleteR(bt,parent)在二叉树bt 中删除结点parent 的右子树。
(7)Search(bt,x)在二叉树bt 中查找数据元素x。
(8)Traverse(bt)按某种方式遍历二叉树bt 的全部结点。

2.算法的实现

算法的实现依赖于具体的存储结构,当二叉树采用不同的存储结构时,上述各种操作的实现算法是不同的。下面讨论基于二叉链表存储结构的上述操作的实现算法。

(1)Initiate(bt)初始建立二叉树bt,并使bt 指向头结点。在二叉树根结点前建立头结点,就如同在单链表前建立的头结点,可以方便后边的一些操作实现。

1 int Initiate (BiTree *bt)
2 {
3     /*初始化建立二叉树*bt 的头结点*/
4     if((*bt=(BiTNode *)malloc(sizeof(BiTNode)))==NULL)
5         return 0;
6     *bt->lchild=NULL;
7     *bt->rchild=NULL;
8     return 1;
9 }

算法6.1

(2)Create(x,lbt,rbt)建立一棵以x 为根结点的数据域信息,以二叉树lbt 和rbt为左右子树的二叉树。

建立成功时返回所建二叉树结点的指针;建立失败时返回空指针。

 1 BiTree Create(elemtype x,BiTree lbt,BiTree rbt)
 2 {
 3     /*生成一棵以x 为根结点的数据域值以lbt 和rbt 为左右子树的二叉树*/
 4     BiTree p;
 5     if ((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL) return NULL;
 6         p->data=x;
 7     p->lchild=lbt;
 8     p->rchild=rbt;
 9     return p;
10 }

算法6.2

(3)InsertL(bt,x,parent)

 1 BiTree InsertL(BiTree bt,elemtype x,BiTree parent)
 2 {
 3     /*在二叉树bt 的结点parent 的左子树插入结点数据元素x*/
 4     BiTree p;
 5     if (parent==NULL)
 6     {
 7         printf(“\n 插入出错”);
 8         return NULL;
 9     }
10     if ((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL)
11         return NULL;
12     p->data=x;
13     p->lchild=NULL;
14     p->rchild=NULL;
15     if (parent->lchild==NULL)
16         parent->lchild=p;
17     else
18     {
19         p->lchild=parent->lchild;
20         parent->lchild=p;
21     }
22     return bt;
23 }

算法6.3

(4)InsertR(bt,x,parent)功能类同于(3),算法略。

(5)DeleteL(bt,parent)在二叉树bt 中删除结点parent 的左子树。当parent 或parent的左孩子结点为空时删除失败。删除成功时返回根结点指针;删除失败时返回空指针。

 1 BiTree DeleteL(BiTree bt,BiTree parent)
 2 {
 3     /*在二叉树bt 中删除结点parent 的左子树*/
 4     BiTree p;
 5     if (parent==NULL||parent->lchild==NULL)
 6     {
 7         printf(“\n 删除出错”);
 8         return NULL;
 9     }
10     p=parent->lchild;
11     parent->lchild=NULL;
12     free(p); /*当p 为非叶子结点时,这样删除仅释放了所删子树根结点的空间,*/
13     /*若要删除子树分支中的结点,需用后面介绍的遍历操作来实现。*/
14     return bt;
15 }

算法6.4

(6)DeleteR(bt,parent)功能类同于(5),只是删除结点parent 的右子树。算法略。操作Search(bt,x)实际是遍历操作Traverse(bt)的特例,关于二叉树的遍历操作的实现,将在下一节中重点介绍。

转载于:https://www.cnblogs.com/chunlanse2014/articles/4583458.html

6.2 基本操作与存储相关推荐

  1. mysql学习【第2篇】:基本操作和存储引擎

    mysql数据库之基本操作和存储引擎 一.知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:studen ...

  2. (王道408考研数据结构)第四章串-第一节:串的定义和基本操作及存储结构

    文章目录 一:串基本概念 (1)串的定义 (2)相关术语 (3)串的基本操作 二:串的比较 三:字符集编码 四:串的存储结构 (1)串的顺序存储 (2)串的链式存储 一:串基本概念 (1)串的定义 串 ...

  3. 怎么用mysql存储系统数据库_mysql数据库之基本操作和存储引擎

    一.知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student,scholl,class_list ...

  4. 线性单链表存储结构c语言代码,单链表定义-(线性表的链表存储结构)

    线性表分为:顺序存储结构和连存储结构 顺序存储结构的优点: 1.空间利用率高,几乎不需要额外的空间开销. 2.数据的逻辑结构和物理结构完全一致. 3.结点地址计算的时间和线性表的规模大小无关. 4.可 ...

  5. 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验

    实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...

  6. 【专栏必读】王道考研408数据结构万字笔记(有了它不需要你再做笔记了):各章节内容概述导航和思维导图

    其他科目导航 [专栏必读]王道考研408计算机组成原理万字笔记(从学生角度辅助大家理解):各章节导航及思维导图 [专栏必读]王道考研408操作系统万字笔记(从学生角度辅助大家理解):各章节导航及思维导 ...

  7. 计算机组成原理关键路径,2020年834数据结构、计算机组成原理大纲(13页)-原创力文档...

    834 "数据结构.计算机组成原理"复习参考提纲 一. 考察目标 834 数据结构.计算机组成原理要求考生比较系统地掌握上述专业基础课程的基本概念.基本 原理和基本方法,能够综合运 ...

  8. Docker 镜像优化与最佳实践

    云栖TechDay41期,阿里云高级研发工程师御坂带来Docker镜像优化与最佳实践.从Docker镜像存储的原理开始,针对镜像的存储.网络传输,介绍如何在构建中对这些关键点进行优化.并介绍Docke ...

  9. Seaweed-FS综合使用测试

    Seaweed-FS综合使用测试 分类: 服务器与存储 2016-03-16 12:11:11 Seaweed-FS综合使用测试 参考信息 https://github.com/chrislusf/s ...

最新文章

  1. RDKit | 基于RDKit从分子中提取3D药效团特征
  2. python 使用PIL模块将文字写入到图片上
  3. c语言程序设计俄罗斯方块PPT,俄罗斯方块游戏:C语言程序设计初步感受
  4. checkStyle -- 代码风格一致
  5. 【ARC103D】Distance Sums【树论】【构造】
  6. 安卓开发替换json字符串中的数据_22个JavaScript开发技巧合集
  7. 凸优化有关的数值线性代数知识 作业题
  8. 宝塔面板 CentOS 系统配置紫猫数据库(一)
  9. 悲剧四个月python培训班,需要踩完坑犯过错,这些免费的编程资源,值得一生推
  10. 梦幻西游手游经验任务链计算机,梦幻西游手游经验和道具任务链攻略
  11. 74cms骑士人才招聘系统源码SE版 v3.16.0
  12. guzzlehttp resulted in a `409 Conflict` response 访问网址 laravel thinkphp
  13. Android USB tethering相关代码
  14. 说说毕业后这十多天的社会生活
  15. 银行网点服务认证_银行网点服务认证标准
  16. 修改ubuntu桌面路径
  17. java 与 汇编_清华大学出版社-图书详情-《汇编语言与计算机体系结构——使用C++和Java》...
  18. 用户访问一个网站的过程描述
  19. 模糊控制——隶属函数
  20. 服务器屏蔽了无线网卡,树莓派永久禁用无线网卡

热门文章

  1. AndFix解析——(上)
  2. 如何构建Android MVVM 应用框架
  3. java8 注解增强_Java8新增的重复注解功能示例
  4. oracle从一个表insert语句,Oracle 使用PLSQL 导出 一个表的insert 语句
  5. rtsp服务器搭建_如何从“零”开始搭建直播平台
  6. 计算机辅助教学( ),27075 计算机辅助教学
  7. c语言用数组发送大写字母怎么读,c语言字符数组大小写转换
  8. word 常用快捷键
  9. BZOJ 3277 串 BZOJ 3473 字符串 (广义后缀自动机、时间复杂度分析)
  10. λ-矩阵(不变因子)