数据结构之树

一、概念:

      1、特点:

        有且只有一个根节点,并且只有根节点这一个节点没有父节点。除父节点外其他每个节点都只有一个父节点,并且每个节点都不能与自己同级的兄妹节点相连。

      2、名词解释:

        ①根节点:类比树根,没有父节点的节点,有且只有一个。所有节点通过直接或间接方式都能找到此根节点,上图中节点A就是根节点;

        ②枝节点:类比树干,既有父节点,又有子节点的节点。

        ③叶子节点:类比树叶,没有子节点的节点。上图中节点D、F、K、M、N、R、S都是叶子节点;

        ④父节点、子节点:类比树干,一般指相邻的上下两级关系,这是相对概念。一个节点既可以作为某些节点的父节点,也可以作为某些节点的子节点。根节点只能作为父节点,叶子节点只能作为子节点;

        ⑤子树节点:以子节点为根节点的树的所有节点;

        ⑥兄妹节点:有相同父节点的两个节点互为兄妹节点;

        ⑦高度:从叶子节点开始从0计数,越靠近根节点,高度越高。上图中节点S高度为0,节点A高度为6;

        ⑧深度:从根节点开始从0计数,离根节点越远,深度越深。上图中节点A深度为0,节点S深度为6;

        ⑨层数:从根节点开始从1计数,离根节点越远,层数越多。上图中节点A层数为1,节点S层数为7,层数=深度+1;

        ⑩阶数:表示一个节点最多有几个子节点;

      3、工具:

        可以使用此网址:Data Structure Visualization icon-default.png?t=N7T8https://www.cs.usfca.edu/~galles/visualization/Algorithms.html动态模拟树的相关操作;

二、分类:

        为解决不同的问题,产生了针对特定场景的树。这些树有自己的特点,根据树的阶可以分为二叉树、N叉树,根据子树的深度可以分为平衡树、非平衡树等。

      1、二叉树:

        限定每个节点的子节点最多只有2个子节点,且有左右之分。

      2、完全二叉树:

        “完全“可以理解为不存在只有1个子节点的节点,只会存在有2个子节点或没有子节点的节点。此外还限定,任意两个叶子节点的层数差不能超过1,且层数多的叶子节点都在左侧。

        二叉树一般用链表实现,但完全二叉树还可以用数组实现。如上图根节点A的下标为1,其他节点按字母顺序依次计数,那么以下规律总成立:如果父节点的下标是n ,那么其左子节点的下标是2n,其右子节点的下标是2n+1。所以就可以用如下数组实现:

        由于完全二叉树的特性,不难得出:假设树的深度为d,树的节点总数为n,那么总会有:

n=2^{d}+m(其中m是小于2^{d}的整数),即:d=floor(㏒₂n)

      3、满二叉树:

        满二叉树是完全二叉树的一种特殊情况,除了要满足完全二叉树的限定条件,还限定所有的叶子节点的层数都相等。

      4、堆:

        堆也是完全二叉树的一种特殊情况,除了要满足完全二叉树的限定条件,还限定子节点中的值和父节点中的值的大小关系约束:

        ①大顶堆:父节点中的值都大于等于其任意子树节点的值;

        ②小顶堆:父节点中的值都小于等于其任意子树节点的值;

      5、二叉搜索树:

        限定二叉树的每个左子节点的值都小于父节点的值,每个右子节点的值都大于父节点的值。即查到指定节点后,左子树节点的值都比自己小,右子树节点的值都比自己大。

      6、平衡二叉树:

        限定二叉树的任意2个叶子节点的层数差不超过1。

      7、自平衡二叉搜索树(AVL树):

        平衡二叉搜索树限定二叉树不仅要满足二叉搜索树的限定,还要满足平衡二叉树的限定。自平衡二叉搜索树则是在这两个限定的基础上,当发生新增或删除一个树节点时,需要通过左旋或右旋的方式,让树继续满足二叉搜索树的限定和平衡二叉树的限定。

      8、红黑树:

        红黑树的节点有红色和黑色两种颜色,根节点是黑色的,叶子节点都是黑色的空节点(叶子节点不存储数据),任意相邻的节点都不能同时为红色(红色节点中间一定有黑色节点隔开),并且任意节点到达其可达的叶子节点的所有路径中的黑色节点的个数必须相等。

        红黑树是节点带有颜色限定的二叉搜索树,但不是严格意义上的平衡二叉树,因为红黑树的叶子节点层数差可能达到一倍。红黑树必须满足如下限定:

        ①根节点是黑色的;

        ②叶子节点是黑色的,且都是null节点;

        ③红色节点的子节点和父节点都是黑色的;

        ④从任意节点到其每个叶子节点的所有路径中都包含相同数目的黑色节点;

      9、B树(B-树):

        描述一棵B树时需要指定它的阶数m,也就是要指定树节点最多有多少个子节点,m=2时树就成了平衡二叉搜索树。m阶的B树有如下限定:

        ①根节点最少得有1个元素(也就是k:v键值对,B树中所说的元素都指k:v键值对,与B+树有区别),2个子节点;

        ②枝节点至少有ceil(m/2)-1个元素,ceil(m/2)个子节点;

        ③每个节点(包括根节点)最多有m-1个元素,m个子节点;

        ④每个节点中的元素都按照从小到大的顺序排列,每个节点的任意元素都比其左子树中所有节点的所有元素都大,都比其右子树中所有节点的所有元素都小;

        ⑤所有叶子节点的层数都相等;

        下图以4阶B树为例,图中每个节点最多可包含3个元素,每个元素都是k:v键值对。图中的数字表示k:v键值对中的key,data表示k:v键值对中的value:

      10、B+树:

        B+树是基于B树的一种变体,有着比B树更高的查询性能。m阶的B+树需要满足B树的相关限定,除了以下限定:

        ①根节点最少得有2个元素,2个子节点;

        ②枝节点至少有ceil(m/2)个元素,ceil(m/2)个子节点;

        ③每个非叶子节点(包括根节点)最多有m个元素(只存储k:v键值对中的key,与B树有区别),m个子节点,m个元素是分别指向m个子节点的指针;

        ④只有叶子节点才存储k:v键值对,叶子节点中的元素都按照从小到大的顺序排列;

        ⑤叶子节点还存储了指向右兄妹节点的指针;

        下图以3阶B+树为例,图中每个节点最多可包含3个元素,3个子节点。每个节点中的元素都存储有key,只有叶子节点才存储data。

      11、B*树:

        B*树是对B+树的改进,提升了树的节点插入、删除性能。m阶的B*树需要满足B+树的相关限定,除了以下限定:

        ①根节点最少得有2个元素,2个子节点;

        ②枝节点至少有ceil(m*2/3)个元素,ceil(m*2/3)个子节点;

        ③每个非叶子节点(包括根节点)最多有m个元素,m个子节点,m个元素是分别指向m个子节点的指针;

        ④只有叶子节点才存储k:v键值对,叶子节点中的元素都按照从小到大的顺序排列;

        ⑤叶子节点存储了指向右侧同级相邻的叶子节点的指针;

        ⑥枝节点存储了指向右侧同级相邻的枝节点的指针;

        下图以3阶B*树为例,图中的每个枝节点还指向右侧同级相邻的枝节点。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值