问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

顺序存储是二叉树常用的存储结构吗

发布网友 发布时间:2022-04-23 09:13

我来回答

1个回答

热心网友 时间:2022-04-05 05:03

二叉树的存储结构
二叉树是非线性结构,即每个数据结点至多只有一个前驱,但可以有多个后继。它可采用顺序存储结构和链式存储结构。
1.顺序存储结构
二叉树的顺序存储,就是用一组连续的存储单元存放二叉树中的结点。因此,必须把二叉树的所有结点安排成为一个恰当的序列,结点在这个序列中的相互位置能反映出结点之间的逻辑关系,用编号的方法从树根起,自上层至下层,每层自左至右地给所有结点编号,缺点是有可能对存储空间造成极大的浪费,在最坏的情况下,一个深度为k且只有k个结点的右单支树需要2k-1个结点存储空间。依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系,这样既能够最大可能地节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。图5-5(a)是一棵完全二叉树,图5-5(b)给出的图5-5(a)所示的完全二叉树的顺序存储结构。

(a) 一棵完全二叉树 (b) 顺序存储结构
图5-5 完全二叉树的顺序存储示意图
对于一般的二叉树,如果仍按从上至下和从左到右的顺序将树中的结点顺序存储在一维数组中,则数组元素下标之间的关系不能够反映二叉树中结点之间的逻辑关系,只有增添一些并不存在的空结点,使之成为一棵完全二叉树的形式,然后再用一维数组顺序存储。如图5-6给出了一棵一般二叉树改造后的完全二叉树形态和其顺序存储状态示意图。显然,这种存储对于需增加许多空结点才能将一棵二叉树改造成为一棵完全二叉树的存储时,会造成空间的大量浪费,不宜用顺序存储结构。最坏的情况是右单支树,如图5-7 所示,一棵深度为k的右单支树,只有k个结点,却需分配2k-1个存储单元。

(a) 一棵二叉树 (b) 改造后的完全二叉树

(c) 改造后完全二叉树顺序存储状态
图5-6 一般二叉树及其顺序存储示意图

(a) 一棵右单支二叉树 (b) 改造后的右单支树对应的完全二叉树

(c) 单支树改造后完全二叉树的顺序存储状态
图5-7 右单支二叉树及其顺序存储示意图
结构5-1二叉树的顺序存储

#define Maxsize 100 //假设一维数组最多存放100个元素
typedef char Datatype; //假设二叉树元素的数据类型为字符
typedef struct
{ Datatype bt[Maxsize];
int btnum;
}Btseq;

2.链式存储结构
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。
通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为:

其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL表示)。利用这样的结点结构表示的二叉树的链式存储结构被称为二叉链表,如图5-8所示。

(a) 一棵二叉树 (b) 二叉链表存储结构
图5-8 二叉树的二叉链表表示示意图
为了方便访问某结点的双亲,还可以给链表结点增加一个双亲字段parent,用来指向其双亲结点。每个结点由四个域组成,其结点结构为:

这种存储结构既便于查找孩子结点,又便于查找双亲结点;但是,相对于二叉链表存储结构而言,它增加了空间开销。利用这样的结点结构表示的二叉树的链式存储结构被称为三叉链表。
图5-9给出了图5-8 (a)所示的一棵二叉树的三叉链表表示。

图5-9二叉树的三叉链表表示示意图
尽管在二叉链表中无法由结点直接找到其双亲,但由于二叉链表结构灵活,操作方便,对于一般情况的二叉树,甚至比顺序存储结构还节省空间。因此,二叉链表是最常用的二叉树存储方式。
结构5-2二叉树的链式存储
#define datatype char //定义二叉树元素的数据类型为字符
typedef struct node //定义结点由数据域,左右指针组成
{ Datatype data;
struct node *lchild,*rchild;
}Bitree;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 饥荒联机怎么下mod 数据结构问题 在邻接表中什么是表节点?什么是表头节点?什么是头节点? 苹果手机怎么下不了迅雷了 饥荒tgp单机版mod怎么使用 饥荒单机mod安装下载图文教程 编写计算树中每一个结点的度,树用孩子-兄弟表示的二叉链表存储 饥荒怎么安装mod,要步骤,和图片。 ...堆栈、队列、二叉树、树、图的各种存储结构,并说明 饥荒怎么下载mod,我没有文件夹!!求! iphone因刷机照片丢失如何恢复有哪些方法 现在的苹果手机,怎么下载不了手机迅雷了? 几道数据结构的题 iphonexr已停用刷机之后一直在恢复数据? 树的存储结构 饥荒腾讯TGPMOD怎么下载 TGPMOD安装方法介绍 苹果手机刷机后为什么一直处于恢复模式? 数据结构用孩子兄弟表示法创建好了树之后运行程序的时候怎么输入树中的结点? 苹果刷机后恢复数据失败怎么办 求高手帮忙,在采用孩子兄弟链表存储的树类tree中,增加以下操作: 返回p结点的第i(i>=0)个孩子结点 以左孩子右兄弟链表为存储结构求树中结点数目(用C语言实现) 苹果手机刷机后怎么恢复数据 《饥荒》手机mod怎么安装? 求树中两个节点最近的共同祖先结点,树的孩子兄弟链表存储,求大神指导。。谢谢~ 苹果手机为什么没有迅雷软件了? 如何创建孩子兄弟法加父节点的树? Steam饥荒创意工坊里的mod怎么下载? 饥荒正版联机的mod怎么弄,在哪下载啊,下载完成后在哪安装,mod用不同花钱啊 怎么给饥荒安装mod? 如图:这个饥荒mod在哪下载?跪求链接 如何去除WPS标题文字自带阴影? 在手机上qq下载的饥荒模组怎么加在饥荒里面 饥荒怎么装mod 最后有图,甚至视频, 没有的话讲详细一点 怎么把饥荒mod下载到QQ文件? 脚本文件夹是什么 脚本文件的后缀 按键精灵制作好的脚本保存在哪个文件夹老? 脚本怎么写? 什么是脚本文件?如何在桌面上新建一个脚本文件? gta5脚本文件夹在哪 怎样写vb脚本得到指定文件夹的名称 松菌可以人工种植吗