树与二叉树,堆

数概念及结构

数是一个非线性的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合,只不过在计算机中的树看起来向倒挂的树;
树中的各个部分因为比较简单,所以在此不做说明可以查看下图:在这里插入图片描述
节点的度:一个节点含有的子树的个数称为该节点的度;
叶节点或终端节点:度为0的节点称为叶节点;
树的度:一棵树中,最大的节点的度称为树的度;(例如上图最大度为3)
森林:由m(m>=0)棵互不相交的树的集合称为森林;
如果树中有相交,那么就不是树
在这里插入图片描述
树的表示方法:
1)双亲表示法

struct Node
{
  TDataType _data;
  strcut Node*  _parent;
}

在这里插入图片描述
孩子的指针指向双亲,这样以来知道孩子找双亲很好找,如果反过来则很麻烦
1)孩子表示法

struct Node
{
  TDataType _data;
  struct Node*  child1;
  struct Node*  child2;
  struct Node*  child3;
}

在这里插入图片描述
因为上面的树最大度为三,所以在里面只需要三个孩子即可;
3)双亲孩子表示法=孩子表示法+双亲表示法
在这里插入图片描述
例如上树:可如图表示A C D F G I brother的指针指向空(如果要遍历这个方式比较简单)

二叉树

一颗二叉树节点是有限的集合,可以为空(空树),或者是由一个根节点和根节点的左子树,右子树组成 根节点 + 左节点 +右节点 = 二叉树
特点:
1)每个节点最多有两颗子树,及二叉树不存在度大于2的结点
2)二叉树的子树有左右之分,其子树的次数不能颠倒
特殊的二叉树:
1). 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是 说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
2.) 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。(从左到右都排满)
在这里插入图片描述
性质1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1)。
性质2:深度为k的二叉树至多有2{k}-1个结点(k≥1)。
性质3:包含n个结点的二叉树的高度至少为log2 (n+1)。
性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。

二叉树的储存结构

1)顺序存储方式
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。例如如图:
在这里插入图片描述
由图可得:完全二叉树没有空间浪费,而左侧的一般二叉树有很多位置没有存到数字,空间浪费。
所以说一般完全二叉树,和满二叉树用此方法存,对于普通二叉树一般不使用该方法,空间利用率低。
2)链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表 中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结 点的存储地址 。链式结构又分为二叉链和三叉链,结构如红黑树等会用到三叉链。 二叉链表(左) ,三叉链(右,其中一个指针指向双亲)
在这里插入图片描述

将一个集合,把他们所有的元素按照完全二叉树树的顺序存储方式储存在一个数组中,并且堆中的某个节点的值总是不大于或者不小于其父节点的值,称为大堆或者小堆;
如图在这里插入图片描述
A图为小堆 B图为大堆
上面小,下面大为小堆
上面大,小面小为大堆

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值