二叉搜索树、B树

「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

二叉搜索树

二叉搜索树顾名思义肯定是二叉树,若二叉搜索树的左右子树存在,则二叉搜索树的该节点的左子树都小于该节点值,右子树也都小于该节点

示例如下:

像上图查找对应value的时间复杂度为O(log<sub>2</sub>(n)),但二叉搜索树不段的插入可能会退化为链表,比如再上图插入17,20,30,45,会变成下图

如果一直这样操作下去,再查找对应值的话,时间复杂度就会变成O(n),因此引出了平衡二叉树

AVL Tree(平衡二叉树)

Balanced binary search trees,平衡二叉树的定义的左右子树深度差绝对值不能超过1,比如右子树的深度是4,左子树的深度只能是3 或者5。

假如我们在第一幅图插入-1,-3,就会变成下图

上图我们可以看到节点1(第一个失衡处的左子树)深度为2,右子树深度为0,深度差为2,这种一般称为LL(造成失衡的节点为-3,左子树的左边)类型失衡。因此我们需要调整,即右旋,变成下图

假如我们在第一幅图插入7,9,就会变成下图

上图我们可以看到节点6(第一个失衡处)的左子树深度为0,右子树深度为2,深度差为2,这种一般称为RR(造成失衡的节点为9,右子树的右边)类型失衡。因此我们需要调整,即左旋,变成下图

假如我们在第一幅图插入-1,0,就会变成下图

上图我们可以看到节点1(第一个失衡处)的左子树深度为2,右子树深度为0,深度差为2,这种一般称为LR(造成失衡的节点为0,在左子树的右边)类型失衡。因此我们需要调整,即先叶子节点绕中间节点左旋,后失衡节点绕上次旋转后的中间节点右旋,变成下图

假如我们在第一幅图插入9,7,就会变成下图

上图我们可以看到节点6(第一个失衡处)的左子树深度为0,右子树深度为2,深度差为2,这种一般称为RL(造成失衡的节点为9,右子树的左)类型失衡。因此我们需要调整,即先叶子节点绕中间节点右旋,后失衡节点绕上次旋转后的中间节点左旋,变成下图

上述的几个过程分别就是LL(右旋),RR(左旋),LR(左右旋),RL(右左旋)

虽然说二叉平衡树可以使搜索保持在O(log<sub>2</sub>(n)),但如果插入过多可能会造成多次平衡调整,这样也是十分浪费时间的,因此又诞生的RB_tree,即红黑树。

猜你喜欢

转载自juejin.im/post/7034901359149187108