欢迎光临散文网 会员登陆 & 注册

《漫画算法2:小灰的算法进阶》第二章 树的进阶

2023-03-24 11:22 作者:方程星  | 我要投稿

什么是二叉查找树

二叉查找树(Binary Search Tree): 

1. 如果左子树不为空,则左子树上所有节点的值均小于根节点的值。

2. 如果右子树不为空,则右子树上所有节点的值均大于根节点的值。

3. 左、右子树也都是二叉查找树。

二叉查找树

二叉查找树会维持节点的有序性,也称作二叉排序树(Binary Sort Tree),无论进行多少次插入、删除操作,都始终保持有序

二叉查找树的插入和删除


5<6,5>3,5>4,因此节点5应该插到节点4的右孩子处

插入后
情况1,待删除的节点没有子节点
待删除的节点12是叶子节点,没有孩子,因此直接删除即可
情况2,待删除的节点有一个孩子
待删除的节点13只有左孩子,于是我们让左孩子节点11取代被删除的节点,
节点11以下的节点关系无须变动
待删除的节点有两个孩子
节点3仅小于节点5,节点6仅大于节点5,两者都是合适的选择。但习惯上我们选择仅大于待删除节点的节点,也就是用节点6来取代它,复制节点6到原来节点5的位置
删除多余的节点6

二叉查找树的缺陷

初始二叉查找树

依次插入如下五个节点:7, 6, 5, 4, 3

虽然这样一棵树也符合二叉查找树的特性,但是查找节点的时间复杂度退化成了O(n)

什么是平衡二叉树

平衡二叉树(AVL树),它在每次插入、删除节点之后,可以进行“自平衡”,也就是通过一系列调整重新达到平衡状态。

对于AVL树的每一个节点,平衡因子是它的左子树高度和右子树高度的差值

只有当二叉树所有节点的平衡因子都是-1, 0, 1这三个值的时候,这棵二叉树才是一棵合格的AVL树。

节点4的左子树高度是1,右子树不存在,所以该节点的平衡因子是1-0=1;节点7的左子树不存在,右子树高度是1,所以平衡因子是0-1=-1;所有的叶子节点,不存在左右子树,所以平衡因子都是0;AVL树对平衡因子的限制(只能是-1,0,1),保证了任意节点的两棵子树的高度差都不超过1,这种状态被称为高度平衡

当AVL树插入或删除节点时,平衡有可能被打破;原本是一棵平衡的AVL树,当插入了新节点1时,父节点2的平衡因子变成了1,祖父节点4的平衡因子变成了2

AVL树提供了两种特殊的操作:左旋和右旋来恢复AVL树的平衡

什么是红黑树

红黑树复杂一些,通过红色和黑色两种节点,以及若干规则来判断平衡;

红黑树的存在目的也是为了维护二叉查找树的平衡

红黑树的规则如下:

1. 节点是红色或黑色。

2. 根节点是黑色。

3. 每个叶子节点都是黑色的空节点(NIL节点)。

4. 每个红色节点的子节点都是黑色(即不存在两个连续的红色节点)。

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

典型的红黑树

红黑树从根到叶子的最长路径不会超过最短路径的2倍

红黑树的调整方法有两种:

调整的方法有两种:变色和旋转

在需要频繁查找时,选用AVL树更合适,在需要频繁插入、删除时,选用红黑树

什么是B树和B+树

B树和B+树非常适合做数据库和文件系统的索引;

B树:

B树单一节点拥有的最多子节点数量,称为B树的“阶”;

一个m阶的B树,具有如下几个特征:

1. 根节点至少有两个子节点。

2. 每个中间节点都包含k-1个元素(也被称为关键字)和k个孩子,其中m/2 <= k<=m。

3. 每一个叶子节点都包含k-1个元素,其中m/2 <= k<= m。

4. 所有的叶子节点都位于同一层。

5. 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

B树
重点来看(2,6)节点,该节点有两个元素2和6,同时又有三个孩子节点(1)、(3,5)、(8);其中元素1小于父节点中的元素2,元素3和5在父节点的元素2和6之间,元素8大于元素6,正好符合刚刚所列的几条特征(哪几个特征???)

B树虽然可以改善数据库查询的性能,但是却存在一个不足之处:不方便进行范围查询。

一个m阶的B+树具有如下几个特征:

1. 有k个子树的中间节点包含k个元素(B树中是k-1个元素),每个元素不保存数

据,所有数据都保存在叶子节点。

2. 所有的叶子节点包含了全部元素,依照元素的大小升序排列,叶子节点之间用双向

指针相连接。

3. 所有中间节点的元素都同时存在于子节点,在子节点元素中是最大(或最小)元

素。

B+树的结构
在上图的这棵B+树中,根节点的元素8在子节点(2, 5, 8)中是最大元素,也是叶子节点(6, 8)的最大元素。根节点的元素15在子节点(11, 15)中是最大元素,也是叶子节点(13, 15)的最大元素。
父节点的所有元素都出现在子节点,因此叶子节点包含了整棵树的全量信息。
并且每一个叶子节点都带有指向相邻叶子节点的指针,形成了一个双向有序链表

B+树用于范围查询十分方便。

小结

二叉查找树

可以提高节点查找的效率,并维持节点的有序性。理想状态下,二叉查找树查找的时间复杂度是O(logn),但如果节点分布失衡,查找的时间复杂度有可能退化到O(n)

平衡二叉树

也叫作AVL树,是一种特殊的二叉查找树,可以自动调节平衡。

AVL树维持着严格的平衡,任意节点的两棵子树的高度差都不超过1。这样的优点是保证了查询的效率,缺点是维持平衡的成本比较高,适合查询较多的场景。

红黑树

是另一种可以自动调整平衡的二叉查找树。

红黑树维持着相对的平衡,要求任何一条路径的长度不超过其他路径长度的2倍。

这样的优点是降低了维持平衡的成本,缺点是查询效率略低,适合频繁插入、删除的场景。

B树

解决了从磁盘海量数据中查询的需求,有效减少了磁盘I/O的频次。

B+树

是B树的升级,叶子节点包括全量数据,并使用双向指针连接相邻节点,为范围查询提供了便利。



《漫画算法2:小灰的算法进阶》第二章 树的进阶的评论 (共 条)

分享到微博请遵守国家法律