树和二叉树->存储结构
文字描述
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.图形或者网状结构 接下来的 ...
随机推荐
- “RESOURCE MONITOR“CPU占用特别高
背景: SQL Server 2008 R2 10.50.1600 没有设置页面文件,内存为64G,数据库分配50G cpu使用占了50%以上,平时只有10-20%,某台服务器“RESOURCE MO ...
- django 返回 code 405
return HttpResponse('Invalid Method',status=405)
- 【iCore1S 双核心板_ARM】例程六:WWDG看门狗实验——复位ARM
实验原理: STM32内部包含窗口看门狗,通过看门狗可以监控程序运行,程序错误 时,未在规定时间喂狗,自动复位ARM.本实验通过按键按下,停止喂狗, 制造程序运行 错误,从而产生复位 . 实验现象: ...
- apache kylin2.10在原生hadoop集群上安装
Install Kylin Download latest Kylin binaries at http://kylin.apache.org/download Export KYLIN_HOME p ...
- npm国内镜像
国内使用默认的源安装较慢,镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry h ...
- Java如何根据主机名(域名)获取IP地址?
在Java编程中,如何根据主机名(域名)获取IP地址? 以下示例显示了如何通过net.InetAddress类的InetAddress.getByName()方法将主机名更改为指定的IP地址. pac ...
- Spark学习笔记——基于MLlib的机器学习
使用MLlib库中的机器学习算法对垃圾邮件进行分类 分类的垃圾邮件的如图中分成4个文件夹,两个文件夹是训练集合,两个文件夹是测试集合 build.sbt文件 name := "spark-f ...
- 集群介绍 keepalived介绍 用keepalived配置高可用集群
集群介绍 • 根据功能划分为两大类:高可用和负载均衡 • 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 • 实现高可用的开源软件有:heartb ...
- 安卓开发笔记——关于开源组件PullToRefresh实现下拉刷新和上拉加载(一分钟搞定,超级简单)
前言 以前在实现ListView下拉刷新和上拉加载数据的时候都是去继承原生的ListView重写它的一些方法,实现起来非常繁杂,需要我们自己去给ListView定制下拉刷新和上拉加载的布局文件,然后添 ...
- 设计模式-行为型模式,python备忘录模式
备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...