数据结构-树

定义
(1)树是一种非线性的数据结构
(2)树是若干个结点的集合(个数>=0),是由唯一的根和若干棵互不相交的子树组成
(3)树的结点树可以为0,对于这种树,我们称为空树
(4)树与图的区别在于树中没有一个闭环

基本术语
(1)结点:组成树的元素,结点包含数据元素和指向子树的分支
(2)结点的度:结点分支数
(3)树的度:结点拥有的最大分支数
(4)叶子结点:度为0的结点
(5)非叶子结点:度不为0的结点,除去根节点的非叶子结点也称为内部结点

【二叉树】–每个结点都最多只有两个子结点的树

高度和深度:高度和深度是相反的表示,深度是从上到下数的,而高度是从下往上数。

我们先来看看高度和深度的定义,某节点的深度是指从根节点到该节点的最长简单路径边的条数,而高度是指从该节点到叶子节点的最长简单路径边的条数。

注意:这里边的条数是规定根节点的深度和叶子节点的高度是1;所以树的深度和高度是相等的,而对其他节点来说深度和高度不一定相等。

在这里插入图片描述
如 B和C节点深度都为2,B的高度为3,而C的高度为2。当然树的深度是4高度也是4。树的高度和深度是相等的

二叉树遍历算法

            A
          /    \
        B        C
      /  \      /  \ 
     D    E     F   G  
 层序遍历结果是:  ABCDEFG
 前序遍历结果是:  ABDECFG  NLR
 中序遍历结果是:  DBEAFCG  LNR
 后序遍历结果是:  DEBFGCA  LRN
 

满二叉树:从形象来看的话满二叉树是一个绝对的三角形,最后一层全部是叶子节点,其它各层是非叶子节点,节点数的计算n=2^k - 1,k表示深度,也就是层数,第i层的节点数n= 2^(i- 1),它的节点数是一系列固定的数,如果节点数不是序列中的数的话,就不是满二叉树。

在这里插入图片描述
完全二叉树:完全二叉树的节点数是任意的,从形式上讲它是个缺失的的三角形,但所缺失的部分一定是右下角某个连续的部分,最后那一行可能不是完整的,对于k层的完全二叉树,节点数的范围2^ (k - 1) -1 < N< 2^k - 1;(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。)
在这里插入图片描述

平衡二叉树【任一结点的左右子树的高度差绝对值不超过1,且左右子树均为平衡二叉树(防止树退化成链表)】

左旋转:逆时针
右旋转:顺时针(钟表旋转方向)

红黑树
R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种平衡二叉树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树
在这里插入图片描述
红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(logN),效率非常之高。
它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。
例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。JDK1.8(hashmap)

B树的特性
一棵m阶的B树的满足条件:
(1)每个节点至多有m棵子树
(2)根节点除外,其它每个分支节点至少有【m/2】棵子树
(3)根节点至少有两棵子树(除非B树只包含一个节点)
(4)所有叶子节点在同一层上,B树的叶子节点可以看成一种外部节点,不包含任何信息。
(5)有j个孩子的非叶结点恰好有j-1个关键码,关键码按递增次序排列。

B+树
B+树是B树的变种,有着比B树更高的查询效率。
1、B+树的特性
(1)有 k 个子树的中间节点包含有 k 个元素(B 树中是 k-1 个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
(2)所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
(3)所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

B+树的使用场景
B+树是在B树的基础上进行改造的,他的数据都在叶子节点,同时叶子节点之间还加了指针形成链表。
B+树多用于数据库中的索引。

那么为什么B+树用于数据库中的索引呢?
因为在数据库中select常常不只是查询一条记录,常常要查询多条记录。比如:按照id的排序的后10条。如果是多条的话,B树需要做中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能够把所有数据取出来了。

B树:
是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;B
树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2);

B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

B树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;所以,B树分配新结点的概率比B+树要低,空间使用率更高;

小结:

B-树:
多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

B+树:
在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

B*树:
在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;

https://mp.weixin.qq.com/s/jRZMMONW3QP43dsDKIV9VQ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值