平衡树、平衡二叉查找树、二叉排序树(查找树)

1、平衡树

(1)概念

平衡树左右子树的高度差的绝对值不超过1(左右子树的高度差为该结点的平衡因子,只能取-1,0,1),且其左右子树也是平衡树。

  • 平衡因子=H左子树-H右子树,即使插入结点后不改变原二叉树的平衡性,平衡因子也会改变。

(2)向平衡树中插入结点时,该结点一定是插入在叶子结点上的。


(2)平衡树的调整

若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。

失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于 1 的结点作为根的子树。假设用 A 表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。

 1  LL 型平衡旋转法

由于在 A 的左孩子 B 的左子树上插入结点 F ,使 A 的平衡因子由 1 增至 2 而失去平衡。故需进行一次顺时针旋转操作。 即将 A 的左孩子 B 向右上旋转代替 A 作为根结点, A 向右下旋转成为 B 的右子树的根结点。而原来 B 的右子树则变成 A 的左子树。

 2  RR 型平衡旋转法

由于在 A 的右孩子 C  的右子树上插入结点 F ,使 A 的平衡因子由 -1 减至 -2 而失去平衡。故需进行一次逆时针旋转操作。即将 A 的右孩子 C 向左上旋转代替 A 作为根结点, A 向左下旋转成为 C 的左子树的根结点。而原来 C 的左子树则变成 A 的右子树。

 3  LR 型平衡旋转法

由于在 A 的左孩子 B 的右子数上插入结点 F ,使 A 的平衡因子由 1 增至 2 而失去平衡。故需进行两次旋转操作(先逆时针,后顺时针)。即先将 A 结点的左孩子 B 的右子树的根结点D 向左上旋转提升到 B 结点的位置,然后再把该 D 结点向右上旋转提升到 A 结点的位置。即先使之成为 LL 型,再按 LL 型处理 。

如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到 A 的左子树上,此时成为 LL 型,再按 LL 型处理成平衡型。

 4  RL 型平衡旋转法

由于在 A 的右孩子 C 的左子树上插入结点 F ,使 A 的平衡因子由 -1 减至 -2 而失去平衡。故需进行两次旋转操作(先顺时针,后逆时针),即先将 A 结点的右孩子 C 的左子树的根结点 D 向右上旋转提升到 C 结点的位置,然后再把该 D 结点向左上旋转提升到 A 结点的位置。即先使之成为 RR 型,再按 RR 型处理。

如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到 A 的左子树上,此时成为 RR 型,再按 RR 型处理成平衡型。

平衡化靠的是旋转。 参与旋转的是 3 个节点(其中一个可能是外部节点 NULL ),旋转就是把这 3 个节点转个位置。注意的是,左旋的时候 p->right 一定不为空,右旋的时候 p->left 一定不为空,这是显而易见的。

如果从空树开始建立,并时刻保持平衡,那么不平衡只会发生在插入删除操作上,而不平衡的标志就是出现 bf == 2 或者  bf == -2 的节点。


2、平衡二叉查找树

(1)左子树中所有节点的值小于根的值,右子树中的所有节点的值大于根的值,

         左右子树的高度之差的绝对值为0或1

(2)平衡二叉查找树=平衡二叉树+二叉查找树

3、最小二叉平衡树的节点

  • 公式如下 F(n)=F(n-1)+F(n-2)+1
    或者说深度为n的平衡二叉树,至少有F(n)个结点。(设n=6)
    Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。注意:F(0)=0,F(1)=1。
    得知平衡二叉树的最少的结点的个数为15。而对于二叉树的最多的结点的个数是i2^h-1=31. 
    因而用排除法,得知是20

4、二叉排序树

中序遍历是递增的序列

平衡树、平衡二叉查找树、二叉排序树(查找树)_第1张图片


对两棵具有相同关键字集合的而形状不同的二叉排序树,按中序遍历它们得到的序列的顺序却是一致的

你可能感兴趣的:(数据结构)