首页 > 其他分享 >数据结构(树)

数据结构(树)

时间:2024-05-25 12:26:14浏览次数:22  
标签:结点 struct 存储 二叉树 BinTreeNode 如上图 数据结构

1.树的概念和结构

树,顾名思义,它看起来像一棵树,是由n个结点组成的非线性的数据结构。

下面就是一颗树:

树的一些基本概念:

结点的度:一个结点含有的子树的个数称为该结点的度; 如上图:A的为6
叶结点或终端结点:度为0的结点称为叶结点; 如上图:B、C、H、I...等结点为叶结点
非终端结点或分支结点:度不为0的结点; 如上图:D、E、F、G...等结点为分支结点
双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点
孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点
兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点
树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为6
结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;
树的高度或深度:树中结点的最大层次; 如上图:树的高度为4
堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点
结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先
子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙
森林:由m(m>0)棵互不相交的树的集合称为森林

2.树的表示

树的表示比线性表复杂,它不仅要存储数据,还要存储和其他结点的关系。

树有很多的表示方法,下面是最为常见的一种:孩子兄弟表示法

typedef int DataType;
struct Node
{
struct Node* firstChild1; // 第一个孩子结点
struct Node* pNextBrother; // 指向其下一个兄弟结点
DataType data; // 结点中的数据域
};

如图:每一个结点都有自己孩子结点和兄弟结点,如果没有就存NULL,这样就可以表示每一个结点了。

3.二叉树的概念和结构

先看下面图:

每一个树干都有两个树枝,这就是我们生活中的二叉树,而数据结构中的二叉树有两种常见又特殊的:

完全二叉树:

满二叉树:

4.二叉树的存储

二叉树的存储有顺序存储和链式存储:

顺序存储:

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树

链式存储:

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

二叉链:

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* left; // 指向当前结点左孩子
struct BinTreeNode* right; // 指向当前结点右孩子
BTDataType data; // 当前结点值域
}

三叉链:

// 三叉链
struct BinaryTreeNode
{
struct BinTreeNode* parent; // 指向当前结点的双亲
struct BinTreeNode* left; // 指向当前结点左孩子
struct BinTreeNode* right; // 指向当前结点右孩子
BTDataType data; // 当前结点值域
};

普通二叉树一般不用顺序结构存储,因为会有空间的浪费,只要完全二叉树才适合顺序存储,也就是堆:

5.堆的概念和结构

堆是一种完全二叉树,堆又分为大堆和小堆。

大堆:每一个父结点都比它的子结点大

小堆:每一个父结点都比子结点小

标签:结点,struct,存储,二叉树,BinTreeNode,如上图,数据结构
From: https://blog.csdn.net/wan__cheng/article/details/139150662

相关文章

  • 数据结构顺序表实现通讯录
    目录1.前言:2.通讯录项目的创建3.通讯录的实现3.1通讯录的初始化3.2通讯录的销毁3.3通讯录添加数据3.4通讯录查找数据3.5通讯录展示数据  3.6通讯录删除数据 3.7通讯录修改数据 4.通讯录完整代码4.1test.c4.2SeqList.h4.3SeqList.c 4.4Contac......
  • 数据结构与算法-快速排序
    快速排序特点:快思路:  1.取第一个元素p,使元素p归位;  2.列表被p分成两部分,左边都比p小,右边都比p大;  3.递归完成排序.快速排序的效率:O(nlogn) 代码实现:defpartition(li,left,right):tmp=li[left]whileleft<right:whileleft<righ......
  • 【老鼠看不懂的数据结构】FHQTreap 初识
    Treap弱平衡的随机性很强的老鼠看不懂的平衡树Q:为什么叫Treap?A:看看二叉搜索树(BST)和堆(Heap),组合起来就是Treap其中,二叉搜索树的性质是:左子节点的值(val)比父节点小右子节点的值(val)比父节点大如果这些节点的值都一样,这棵树就会退化成一颗(?)链。对,我知道你在想......
  • 数据结构与算法学习——动态规划
    动态规划动态规划(英语:Dynamicprogramming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题[1]和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素......
  • 在数据结构上,后端要求前端在一个对象中添加一个类型字段,并且对该对象的某些属性中都加
    这个需求的合理性取决于具体的应用场景和目的。让我们分析一下:合理性的一面:简化逻辑处理:如果这个类型字段是为了在后端快速区分或过滤不同类型的对象属性,那么在前端就做好标记,可以简化后端处理逻辑,减少在后端进行类型判断的需要。一致性保证:在前端加入类型字段并确保它与对象......
  • redis数据结构:RedisObject,SkipList,SortedSet
    1.RedisObject对象redis中任何KV都会被封装为RedisObject对象,也叫做Redis对象 2.SkipList跳表元素按照升序排列存储,是有序的双向链表节点可以有多个指针,并且跨度不同。指针个数根据节点数自动生成,1~32性能和红黑树;二分查找差不多。实现简单,但是空间复杂度高样例:1——2......
  • 数据结构学习笔记-判断是否为无向图
    判断是否为无向图问题描述:设图G用邻接矩阵A[n+1,n+1]表示,设计算法以判断G是否是无向图。【算法设计思想】遍历矩阵使用两层嵌套的for循环,外层循环变量......
  • 数据结构学习笔记-求图的邻接顶点
    求图的邻接顶点问题描述:已知图G用邻接矩阵存储,设计算法以分别实现函数firstadj(G,v)和nextadj(G,v,w)。【算法设计思想】firstadj(G,V)函数:遍历顶点v的所有可能邻接顶点(即矩阵G[v][j]的所有列)。对于每一个顶点j,检查G[v][j]是否不等于0(表示v和j之间有边)。如果找到......
  • 方方方的数据结构
    总算给我看懂到底是什么意思了。。。首先我们来考虑按照时间+扫描线进行处理,假设操作如下黑色是加操作,黄色是乘操作,绿色是加操作,对于红色那条线所代表的点,随着时间的流逝,首先在刚刚进入黑色的时候,这一点的值就被加上了一个数,然后刚刚进入黄色的时候,这一点的值就被乘上了一个数,......
  • 数据结构学习笔记-有向图的度
    求有向图的度问题描述:已知有向图G用邻接矩阵存储,设计算法以分别求解顶点vi的入度、出度和度。【算法设计思想】出度的计算(getOutDegree)遍历法:通过遍历邻接矩阵中顶点vi所在行的所有元素来计算vi的出度。对于每个元素matrix[vi][j],如果其值不为0(表示存在从顶点vi到顶点......