我带你们一起爬树
一片森林到底有多少种树
又是我,我改名字啦,麻辣烫真是个好东西(好久没写博客了)!
追根溯源
这几天看抖音总看见这个海王那个海外,一个个的看着都可厉害了,我就不一样了,我没有池塘,但我有森林啊,人家有乖巧的,温柔的……,我有两个叉的,两个颜色的……我是隔壁的泰山,抓住爱情……
刨析各种树
树的家族真的是庞大的很呦,无序树,有序树,二叉树,完全二叉树,强平衡二叉树,弱平衡二叉树,avl树,红黑树,b树,b+树。
这个思维导图是不是直观体现了树家族的庞大,但我们也不都说,别怕,我们就挑几个常见的树说
二叉树和他的进化版本们
一提到树大部分人脑中出现的都是二叉树,而且说其他的树都是在二叉树的基础上演变过去的
二叉树,树如其名,就是有两个叉的树,结构也非常的简单,先说说树的一些相关术语
节点:包含数据元素和若干指向子树分支信息,就是图上各个字母。
根节点:是指树的起始节点,也就是F节点
叶子节点:是指不在有分支的节点,下图中的A,B,H,M就是叶子节点
子节点:除根节点和叶子节点意外的节点。
树的深度:树的高度。
进化第一次——有序二叉树
上图是一个无序二叉树,有序二叉树是指子树的次序是有先后的,一般是左子树元素小于根节点,右子树元素大于根节点
二次进化——完全二叉树与满二叉树
这是一个满二叉树(上图),满二叉树满足深度为k且有2^k-1个结点
这是一个完全二叉树(上图),满足当二叉树的深度为h时,它的h层节点必须都是连续靠左并不可隔开的(满二叉树也符合),并且1~h-1层的结点数都达到最大个数(即1~h-1层为一个满二叉树)。
究极进化——二叉搜索树,强平衡二叉树
二叉搜索树也叫二叉排序树,是二叉有序树的进化版,包含以下规则:
(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)任意节点的左、右子树也分别为二叉查找树;
(4)没有键值相等的节点。
强平衡二叉树是二叉搜索树的进化版,包含以下规则:
(1)左右两子树的高度差的绝对值不能超过 1;
(2)左右两子树也是一颗平衡二叉树。
弱平衡树一般就是指红黑树了,树如其名
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色
性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3.所有叶子都是黑色。(叶子是NIL节点)
性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5。从任一节点到其每个叶子的所有路径都包含相同数目的黑色结点。
红黑树就是一个没有 AVL 树 那样平衡,因此插入、删除效率会高于 AVL (强平衡树)树,而 AVL树的查找效率显然高于红黑树
B树一族
B树(B-TREE)
B树是多叉树,也叫又名平衡多路查找树,大概就张这个样子,多用于数据库的索引,有兴趣的去看我另一篇博客,也有介绍
(1)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;
(2)子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);
(3)关键字数:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);
(4)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;
B+树
B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分查找
1、B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;
2、B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;
3、B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
4、B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。
B树相对于B+树的优点是,如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,所以这种数据检索的时候会要比B+树快。
最后给你们推荐一本书吧
如果有错误或者需要补充请写在下面,跟我打一架!
古德拜~