AVL树,伸展树,B树的一些概念

来源:互联网 发布:java运行库安装 编辑:程序博客网 时间:2024/05/22 17:29
1,AVL树是带有平衡条件的二叉查找树,我们知道二叉查找树的定义是对于树中任意的节点X,它的左子树的所有项的值都小于X的值,它的右子树的所有项的值都大于X的值。

带有平衡条件的二叉查找树,是为了解决一个问题,什么问题呢?

  问题是:当向一棵树输入预先排序好的数据时,二叉查找树所有节点都没有左儿子,这是对这棵树的操作的代价就会很大。

  AVL树的平衡条件是:每个节点的左子树和右子树的高度最多差1。(空树的高度定义为-1)

  在建造AVL树的时候,每插入一个节点判断树是否平衡,当树不满足平衡条件时,进行简单的修正。

  两种修正方法:单旋转,双旋转。

  1,单旋转:

    对a的左儿子的左子树进行一次插入;对a的右儿子的右子树进行一次插入;使a的两颗子树的高度差为2;此时使用单旋转

  2,双旋转:

    对a的左儿子的右子树进行一次插入;对a的右儿子的左子树进行一次插入;使a的两颗子树的高度差为2;此时使用双旋转

  AVL树删除节点:

    a.当被删除节点n是叶子节点,直接删除。

   b.当被删除节点n只有一个孩子,删除n,用孩子替代该节点的位置。

   c.当被删除结点n存在左右孩子时,真正的删除点应该是n的中序遍历的前驱,或者说是左子树最大的节点,之后n的值替换为真正删除点的值。这就把c归结为a,b的问题。
  删除之后还要考虑是否平衡,

2,伸展树保证从空树开始连续M次对树的操作最多话花费O(MlogN)时间,

解决的问题:因为要求O(logN)的摊还时间界,只要一个节点被访问,它就必须被移动,否则,一旦发现一个深层的节点,我们就有可能不断对它进行访问,如果这个节点部不移动,而每次右花费O(N),那么M次访问将花费O(M*N)的时间。

伸展树的基本思想:当一个节点被访问后,它就要经过一系列AVL树的旋转被推到根上。

方法1:执行单旋转

    事实证明,对一个节点的访问会将另一个节点向深处推进,并没有改善访问路径上其他节点的状况。使用这个策略将会存在一系列M个操作共需要O(M*N)的时间,因此方法不够好。

方法2:展开

    思路与上面的旋转相似,但在旋转如何实施上我们稍微有些选择的余地。我们仍然从底部向上沿着访问路径旋转。

情形:

   1,之字形  使用AVL双旋转

   2,一字形  使用一字形旋转

对一个节点访问之后,它总是处于其中一种情形,使用对应的方法展开,直到将节点推到根上。

3 ,B树(B-tree)本质上是一种针对外存储器设备设计的多路平衡查找树,该数据结构及其扩展结构(B+树,B*树等)被广泛应用于文件系统,数据库索引等。

  平衡二叉查找树在:AVL树,伸展树,红黑树等等下一章讲红黑树。

  
0 0
原创粉丝点击