数据结构与算法之树(二)

这里接上前面树的第一篇,记录下其他的树。

带有平衡条件的二叉查找树

AVL(Adelson-Velskii 和Landis)树是带有平衡条件的二叉查找树。
平衡二叉树的特点:

  1. 任何节点的两个子树的最大高度差为1;
  2. 查找、删除、插入在平均和最坏情况下都是o(log n);
    这里写图片描述
    如图。上面就是符合条件的二叉平衡树。

二叉平衡树之旋转

二叉平衡树在执行插入操作过程中如果破坏了原来的二叉平衡树条件可以通过执行旋转,保持二叉平衡树的条件。

  1. 单旋转
    这里写图片描述
    如图,左边是二叉树平衡条件被破坏的二叉树,通过右单旋转,20号变为根节点,f变为30的左节点,二叉树重新平衡。这样的操作就叫做一次单旋转。
  2. 双旋转
    这里写图片描述
    如图,左边是不平衡的二叉树,右边是经过双旋转重新平衡后的二叉树。
    左边的二叉树经过单旋转不能满足要求,需要把k2当做根节点,把k2的子节点分配到k1和k3两个节点上做子节点。
    这里写图片描述
    上图为实现上面的图的双旋转的中间状态,即经历过一次单旋转变成的中间状态,由图可知仍不满足需求,所以需要再次进行一次单旋转。

伸展树

百度百科定义:假设想要对一个二叉查找树执行一系列的查找操作,为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法, 在每次查找之后对树进行重构,把被查找的条目搬移到离树根近一些的地方。伸展树应运而生。伸展树是一种自调整形式的二叉查找树,它会沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去。伸展树的基本想法是:当一个节点被访问后,就要经过一系列avl树的旋转被推到根上。
这里写图片描述
上图表示9号被访问后变为根节点,就是一次伸展过程。

B树

B树是一种多叉平衡平衡搜索树,因此一个父节点不仅仅有两个节点,可能有很多节点,也就是多叉。
这里介绍下B树的变形B+树。
B+树是有如下特点的B树(以阶为M的B树为例):

  1. 数据项存储在树叶上;
  2. 非叶节点存储直到M-1个关键字以指示搜索的方向;关键字i代表子树i+1中的最小关键字;
  3. 树的跟或者是一片树叶,或者其儿子树在2和M之间;
  4. 除根外,所有非树叶节点的儿子数在[M/2]和M之间;
  5. 所有的树叶都在相同的深度上,并有[L/2]和L之间个数据项。
    这里写图片描述
    如图展示的就是一颗b+树。根存储的叶子的位置,第三层才是数据。第二层存储的又是下面子列的首个数据项的位置。
    插入:当子列的数据项满时,如果父节点还有位置则重新开启一列数据项;如果没有位置则由父节点的父节点开启位置,重新分配数据。

猜你喜欢

转载自blog.csdn.net/fengyibande/article/details/80548507