数据结构-平衡二叉树

1、基本概念                                                       算法

从查找时间上来考虑,高度为n的二叉查找树(Binary Search Tree),在最坏的状况下查找时间为O(n)。而最好的状况下查找时间是O(logn),所以咱们指望二叉树永远处于最好的状况。spa

基于这个指望,1962年阿德尔森-维尔斯和兰迪斯(Adelson-Velskii and Landis)提出了一种节点在高度上相对平衡的二叉查找树,它的平均和最坏状况下的查找时间都是O(logn),同时插入和删除的时间复杂性也会保持O(logn),且在插入或删除以后,高度上仍然保持平衡。这种树称为平衡二叉树(Balanced Binary Tree)。因为提出者的缘由,平衡二叉树也被称为AVL树。3d

2、平衡二叉树的特色                                                 指针

平衡二叉树是一个高级的二叉排序树(Binary Search Tree),除二叉排序树的特色外:blog

(1)左右子树深度差的绝对值不超过1;排序

(2)左右子树也是平衡二叉树。二叉树

平衡因子:BF = 左子树的深度 - 右子树的深度。im

平衡因子的取值只能是一、0、-1。若其绝对值大于,则失去平衡性。margin

3、算法思想                                                        
img

若一颗平衡二叉树被插入一个新的节点后失去了平衡性。首先要找出失去平衡的最小子树的根节点的指针。而后调整这颗子树中节点之间的位置关系,使其恢复平衡性。

失去平衡的最小子树是指离插入节点最近且平衡因子绝对值大于1的根节点所在的最小子树。

若A为失去平衡性的最小子树的根节点,则恢复平衡性的办法可概括为如下四种:

(1)LL(左孩子的左子树)型平衡旋转法

 插入前:A的左子树B和右子树E的深度分别为1和0,所以A的平衡因子是1,处于平衡状态,

               同理,其B子树和E子树也是处于平衡状态的。

插入后:A的左子树B和右子树的深度分别为2和0,所以A的平衡因子是2,处于非平衡状态。

              而B子树和E子树此时是处于平衡状态的。

  • 分析:因为在A的左孩子B的左子树上插入F节点,使A失去了平衡性,所以采用LL型旋转法(一次顺时针旋转操做)。
  • 旋转:将B节点向右上顺时针旋转,代替A做为根节点,A向右下旋转成为B的右子树的根节点。
  • 调整:因为旋转后的B节点此时拥有三颗子树,所以它不符合平衡二叉树的性质,须要继续调整。因为B<D<A,将D调整做为A的左子树。

通过以上三个步骤,插入F后的平衡二叉树又恢复了平衡状态,具体过程由下图所示:

 

 

相关文章
相关标签/搜索