树和二叉树->存储结构
文字描述
1 二叉树的顺序存储
用一组地址连续的存储单元自上而下,自左至右存储完全二叉树上的结点元素。
这种顺序存储只适用于完全二叉树。因为,在最坏情况下,一个深度为k且只有k个结点的单支树却需要长度为2k-1的一维数组。
2 二叉树的链式存储(二叉链表):
链表中的结点至少包含3个域:数据域,左指针域,右指针域;
3 二叉树的链式存储(三叉链表):
链表中的结点至少包含4个域:数据域,左指针域,右指针域, 和指向其双亲结点的指针域。
4 树的双亲表示法
以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置。
5 树的孩子表示法
把每个结点的孩子结点排列起来,看成一个线性表,且以单链表存储结构,则n个结点有n个孩子链表(叶子的孩子链表为空表)。而n个头指针又组成一个线性表,为了便于查找,也采用顺序存储结构。
6 树的孩子兄弟表示法,又称二叉树表示法,或二叉链表表示法。
即以二叉链表做树的存储结构。连报表中的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为firstchild和nextsibling。
示意图





代码实现
#include <stdio.h>
#include <stdlib.h> #define DEBUG
/*树中结点的最大个数*/
#define MAX_TREE_SIZE 100 typedef char KeyType;
typedef int InfoType; /*树中的结点类型*/
typedef struct{
KeyType key;
InfoType otherinfo;
}TElemType; ///////////////////////////////////////////
// 二叉树的存储结构 //
////////////////////////////////////////// /*
* 二叉树的顺序存储
*
*用一组地址连续的存储单元自上而下,自左至右存储完全二叉树上的结点元素。
*0 号单元存储根结点
*/
typedef TElemType SqBiTree[MAX_TREE_SIZE]; /*
* 二叉树的链式存储(二叉链表)
*
* 链表中的结点包含三个数据:数据域data,左指针域lchild,右指针域rchild
*/
typedef struct BiTNode2{
TElemType data;
struct BiTNode2 *lchild, *rchild;
}BiTNode2, *BiTree2; /*
* 二叉树的链式存储(三叉链表)
*
* 链表中的结点包含四个数据:数据域data,左指针域lchild,右指针域rchild,指向其双亲结点的指针域parent
*/
typedef struct BiTNode3{
TElemType data;
struct BiTNode3 *lchild, *rchild, *parent;
}BiTNode3, *BiTree3; ////////////////////////////////////////
// 树的存储结构 //
/////////////////////////////////////// /*
* 树的双亲表示法
*
* 以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置。
*/
//结点结构
typedef struct PTNode{
//结点的数据域
TElemType data;
//结点的双亲位置域
int parent;
}PTNode;
//树的结构
typedef struct{
//树的结点
PTNode node[MAX_TREE_SIZE];
//树的根的位置
int r;
//树的结点数
int n;
}PTree; /*
* 树的孩子表示法
*
* 把每个结点的孩子结点排列起来,看成一个线性表,且以单链表作存储结构,
* 则n个结点有n个孩子链表(叶子的孩子链表为空表)。而n个头指针又组成一个线性表,
* 为了便于查找,便采用顺序存储结构。
*/
//孩子结点
typedef struct CTNode{
int child;
struct CTNode *next;
} *ChildPtr;
typedef struct{
TElemType data;
//孩子链表头指针
ChildPtr firstchild;
}CTBox;
typedef struct{
CTBox nodes[MAX_TREE_SIZE];
//结点数
int n;
//根的位置
int r;
}CTree; /*
* 树的孩子兄弟表示法,别名二叉树表示法,二叉链表表示法
*
* 以二叉链表作树的存储结构,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点
*/
typedef struct{
//data为数据域
TElemType data;
//firstchild指向该结点的第一个孩子结点
struct CSNode *firstchild;
//nextsibling指向该结点的下一个兄弟结点
struct CSNode *nextsibling;
}CSNode, *CSTree; int main(int argc, char *argv[])
{
printf("本代码只是用C表示树和二叉树的如下几种存储结构: \n\n");
printf("二叉树的顺序存储、二叉树的链式存储(二叉链表)、二叉树的链式存储(三叉链表)\n\n");
printf("树的双亲表示法、树的孩子表示法、树的孩子兄弟表示法\n\n");
return ;
}
树和二叉树的存储结构(C语言)
运行

树和二叉树->存储结构的更多相关文章
- 数据结构(C语言版)-第5章 树和二叉树
5.1 树和二叉树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n = 0):或为非空树,对于非空树T:(1)有且仅有一个称之为根的结点:(2)除根结点以外的其余结点可分为m(m& ...
- Java数据结构——树、二叉树的理论知识汇总
通用树的理论知识 一.树的定义 由一个或多个(n>=0)节点组成的有限集合T,有且仅有一个节点称为根(root),当n>1时,其7余的节点为m(m>=0)个互不相交的有限集合T1,T ...
- 二叉树的二叉链表存储结构及C++实现
前言:存储二叉树的关键是如何表示结点之间的逻辑关系,也就是双亲和孩子之间的关系.在具体应用中,可能要求从任一结点能直接访问到它的孩子. 一.二叉链表 二叉树一般多采用二叉链表(binary linke ...
- C#数据结构-二叉树-链式存储结构
对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...
- Java数据结构——树的三种存储结构
(转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...
- Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)
Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...
- C++实现二叉树的链接存储结构(先根、中根和后根遍历)
验证二叉树的链接存储结构及其上的基本操作. [实验要求]: 1. 从文件创建一棵二叉树,并对其初始化: 2. 先根.中根.后根遍历二叉树: 3. 在二叉树中搜索给定结点的父结点: 4. 搜索二叉树中符 ...
- Java数据结构之树和二叉树(2)
从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...
- Java数据结构之树和二叉树
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
随机推荐
- Android开发(十七)——关闭中间activity
参考: http://java--hhf.iteye.com/blog/1826880
- iOS之加载Gif图片
Gif图片是非常常见的图片格式,尤其是在聊天的过程中,Gif表情使用地很频繁.但是iOS竟然没有现成的支持加载和播放Gif的类. 简单地汇总了一下,大概有以下几种方法: 一.加载本地Gif文件 1.使 ...
- mac中安装wxpython
一.简介 wxPython是Python语言的一套优秀的GUI图形库,允许Python程序员很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets ...
- FilenameFilter总结
一.FilenameFilter介绍 java.io.FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件: 一般地: (1)String[] fs = f.l ...
- 线程安全的ConcurrentQueue<T>队列
队列(Queue)代表了一个先进先出的对象集合.当您需要对各项进行先进先出的访问时,则使用队列.当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队. ConcurrentQueue< ...
- Android Things:树莓派3上手就是这么简单
http://blog.csdn.net/p106786860/article/details/54566620 ——————————————————————————————————————————— ...
- Java知多少(45)未被捕获的异常
在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public static void ma ...
- 正确理解springboot的常用注入方式
springboot的属性注入 以注入dataSource为例1.springboot默认读取的文件是放在resources目录下的名为application.properties或applicati ...
- 使用gdbserver远程调试
使用gdbserver远程调试 1.默认crosstool交叉编译器没有自带gdbserver,需要自行编译 到GNU官方FTP下载,目前最新版的是gdb-6.7.1下载地址:http://ftp ...
- ios开发之--valueForKeyPath的用法
1.获取数组中的平均值,最大值,最小值,总和,代码如下: NSArray *ary = @[@,@,@,@,@,@,@]; [self caculateArray:ary]; -(NSString * ...