文字描述

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语言)

运行

树和二叉树->存储结构的更多相关文章

  1. 数据结构(C语言版)-第5章 树和二叉树

    5.1  树和二叉树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n = 0):或为非空树,对于非空树T:(1)有且仅有一个称之为根的结点:(2)除根结点以外的其余结点可分为m(m& ...

  2. Java数据结构——树、二叉树的理论知识汇总

    通用树的理论知识 一.树的定义 由一个或多个(n>=0)节点组成的有限集合T,有且仅有一个节点称为根(root),当n>1时,其7余的节点为m(m>=0)个互不相交的有限集合T1,T ...

  3. 二叉树的二叉链表存储结构及C++实现

    前言:存储二叉树的关键是如何表示结点之间的逻辑关系,也就是双亲和孩子之间的关系.在具体应用中,可能要求从任一结点能直接访问到它的孩子. 一.二叉链表 二叉树一般多采用二叉链表(binary linke ...

  4. C#数据结构-二叉树-链式存储结构

    对比上一篇文章"顺序存储二叉树",链式存储二叉树的优点是节省空间. 二叉树的性质: 1.在二叉树的第i层上至多有2i-1个节点(i>=1). 2.深度为k的二叉树至多有2k- ...

  5. Java数据结构——树的三种存储结构

    (转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...

  6. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  7. C++实现二叉树的链接存储结构(先根、中根和后根遍历)

    验证二叉树的链接存储结构及其上的基本操作. [实验要求]: 1. 从文件创建一棵二叉树,并对其初始化: 2. 先根.中根.后根遍历二叉树: 3. 在二叉树中搜索给定结点的父结点: 4. 搜索二叉树中符 ...

  8. Java数据结构之树和二叉树(2)

    从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...

  9. Java数据结构之树和二叉树

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

随机推荐

  1. 4. OpenAI GPT算法原理解析

    1. 语言模型 2. Attention Is All You Need(Transformer)算法原理解析 3. ELMo算法原理解析 4. OpenAI GPT算法原理解析 5. BERT算法原 ...

  2. Python中的get和set方法

    众所周知,像Java,C++这些语言中都有private这种修饰符,一般声明类的时候,我们都用private声明一个属性,然后给它写一个get方法和一个set方法,可能有人有疑问,为啥不直接写成pub ...

  3. 教你一招:使用最快速的方式激活windows10专业版

    1.安装win10专业版 2.在桌面新建“文本文档.txt” 3.复制如下代码到新新建的“文本文档.txt”中 slmgr /ipk VK7JG-NPHTM-C97JM-9MPGT-3V66T slm ...

  4. Java知多少(91)对话框

    对话框是为了人机对话过程提供交互模式的工具.应用程序通过对话框,或给用户提供信息,或从用户获得信息.对话框是一个临时窗口,可以在其中放置用于得到用户输入的控件.在Swing中,有两个对话框类,它们是J ...

  5. Eclipse 4.4(luna) 安装Veloeclipse 2.0.8时报错的问题

    在Eclipse下编辑Velocity模板的插件,支持语法着色,代码向导等功能,简单好用,没有可视化编辑. Eclipse的更新地址是:http://veloeclipse.googlecode.co ...

  6. (原)使用TortoiseGit提交代码push的时候报错:HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large

    今天我想rk的sdk包里面的一些东西提交到我的git服务器上,结果,总是报错,折腾了一下午,结果才解决. 首先看看我提交代码的时候,报错的信息: git.exe push --progress &qu ...

  7. 爱快路由计费系统easyradius隆重发布,支持V2版本,欢迎大家测试使用

    随着PA.BV接口的发布的临近,我们已经对ROS及爱快V2接口进行大量的升级工作 经用户测试,各方便已满足用户需求. 其实很早以前我们就有支持爱快路由的打算,但是由于各方便原因,通讯接口做好了,但是并 ...

  8. Scala学习笔记——样本类和模式匹配

    1.样本类 在申明的类前面加上一个case修饰符,带有这种修饰符的类被称为样本类(case class). 被申明为样本类的类的特点:1.会添加和类名一致的工厂方法:2.样本类参数列表中的所有参数隐式 ...

  9. 编译使用tensorflow c版本动态链接库

    注意:如果是linux或mac os操作系统,可以参考https://www.tensorflow.org/install/install_c,直接下载对应的so库和头文件,然后跳到步骤4.如果不能使 ...

  10. [UI] 02 - Layout & CSS3

    开胃小菜 一.纯CSS布局 UI效果 From: 创建一个没有表格的网页 代码详情 <!DOCTYPE html> <html> <head> <meta c ...