树和二叉树->存储结构
文字描述
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.图形或者网状结构 接下来的 ...
随机推荐
- 机器学习&深度学习基础(目录)
从业这么久了,做了很多项目,一直对机器学习的基础课程鄙视已久,现在回头看来,系统的基础知识整理对我现在思路的整理很有利,写完这个基础篇,开始把AI+cv的也总结完,然后把这么多年做的项目再写好总结. ...
- talk 1
话转偏锋 让别人可以接话, 同时可以设计转换到的话题, 把"谈话带到正确的轨道", 就像下象棋一样, 要看三步 A: 很喜欢看篮球比赛, 对B说 我每次都堵湖人队会赢 B: 篮球最 ...
- java多线程系列(四)---ReentrantLock的使用
Lock的使用 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理 ...
- .Net MVC Cache 缓存技术总结
一.细说 ASP.NET Cache 及其高级用法 二..Net环境下的缓存技术介绍 (转) 三.asp.net中缓存的使用介绍一 四.HttpContext.Current.Cache 过期时间
- Mac 环境 Vue 开发 CPU 占用率高 问题
Mac开发Vue应用时,发现CPU风扇转的老高. htop查看一下: 问题找到了,就是这个dev-server.js,node起的进程. 然后就是 dtruss -p 1230(进程ID) 命名跟踪一 ...
- MFC AfxMessageBox(_T("Please Load Rawdata First !"));
AfxMessageBox(_T("Please Load Rawdata First !"));
- 从Elasticsearch来看分布式系统架构设计
分布式系统类型多,涉及面非常广,不同类型的系统有不同的特点,批量计算和实时计算就差别非常大.这篇文章中,重点会讨论下分布式数据系统的设计,比如分布式存储系统,分布式搜索系统,分布式分析系统等. 我们先 ...
- js替换元素与设置时间间隔
var lastReportTime = 0; //设置时间间隔 window.onload = function(){ setInterval(handleRefresh, 3000); } fun ...
- css - Grid网格布局
.wrapper{ display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 1 ...
- Spring.NET依赖注入框架学习--实例化容器常用方法
Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...