我们先来看一个场景,然后再看下面的定义,以便深刻理解和记忆
https://blog.csdn.net/qq_29373285/article/details/88610654
二叉树
特点:每个节点最多有两个子节点
完全二叉树:高度为k的二叉树,其1~h-1层为满结点,且其h层(叶子结点层)的节点从左至右依次排列(最多2^h-1个,最少0个)
满二叉树:除最后一层外,每个结点都有左右子结点的二叉树
平衡二叉树:任一结点的左右子树的高度差绝对值不超过1,且左右子树均为平衡二叉树(防止树退化成链表)
B树
**B树和二叉树的区别:**二叉树最多能有两个子节点;B树最多只能有M个子节点,最少有三个子节点
查找
多路查找
- 从根节点开始,若key=k[i],查找成功,否则根据值范围去对应子树查找
插入
以关键字序列{1,2,6,7,11,4,8,13,10,5}为例,构建5阶B树,则一个结点最多关键字4个
1.1,2,6,7组成根节点
2.插入11,超出4个关键字,以中心关键字6进行拆分
3.插入4,8,13后
4.再插入10,以关键字10进行拆分
删除
需要先找到待删除的关键字,删除中若结点关键字不满足要求,则重新分配关键字
这是可能需要向其兄弟结点借关键字或者和其孩子结点进行关键字的交换,也可能需要进行结点的合并,其中,和当前结点的孩子进行关键字交换的操作可以保证删除操作总是发生在终端结点上
B+树
**介绍:**B+树是B树的升级版本,就目前情况,绝大部分都已经用B+树代替了B树了,文件管理、索引等等,当然,具体为什么可以看下面的优点介绍
**区别:**B+树非叶子节点不存储数据,每个叶子节点指向相邻的叶子节点
查找插入删除与B树类似
但 B+树提供了旋转功能,来尽可能的减少页的拆分
旋转发生在leaf Page已经满了、但是其左右兄弟节点没有满的情况下
B树与B+树的比较
1.B树中关键字集合分布在整棵树中,叶节点中不包含任何关键字信息,而B+树关键字集合分布在叶子结点中,非叶节点只是叶子结点中关键字的索引;
2.B树中任何一个关键字只出现在一个结点中,而B+树中的关键字必须出现在叶节点中,也可能在非叶结点中重复出现;
红黑树
本质:自平衡二叉树
在二叉查找树基础上,添加以下性质
-
节点是红色或黑色
-
根节点是黑色
-
每个为空的叶子节点是黑色的
-
每个红色节点的两个子节点都是黑色
-
从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点
时间复杂度为O(lgn)
插入
- 将红黑树当做一颗二叉查找树插入 2. 将插入的节点着色为“红色”(基于性质5) 3. 通过一系列旋转或重新着色等操作,使之重新成为一颗红黑树(不会违背性质1,2,3只需考虑性质4) 4. 进行情况判断,修正红黑树
删除
和二叉树差不多
优点
- 红黑树的插入删除效率更高,任何不平衡都会在三次旋转内解决 2. 二叉平衡树比红黑树更为平衡,因此插入或删除时变动频次更高,但查找效率也更高
如何判断一个树是否有环
1.遍历结点,标识是否遍历过
2.记录每个结点到终点的坐标