理论基础 —— 查找 —— 平衡二叉树

【概述】

二叉排序树的查找效率取决于二叉排序树的形态,而构造一棵形态均匀的二叉排序树与结点的插入次序有关,但结点的插入次序不是随人的意志决定的,这就要求我们找到一种动态平衡的方法,对于任意给定的关键码序列都能构造一科形态均匀、平衡的二叉排序树。

平衡二叉树(Balance Binary Tree)又称 AVL 树,其本质是一种高度平衡的二叉排序树,其或是一棵空的二叉排序树,或是满足以下性质的二叉排序树:

  • 根结点的左子树和右子树深度最多相差 1
  • 根结点的左子树和右子树也是平衡二叉树

根据平衡二叉树的定义,将某个结点的左子树的深度与右子树的深度之差称为平衡因子(Balance Factor),将在平衡二叉树构造过程中,以距离插入结点最近的、且平衡因子绝对值大于 1 的结点为根的子树称为最小不平衡子树(Minimal Unbalance SubTree)

【平衡二叉树的构造】

构造平衡二叉树的基本思想是:在构造二叉排序树的过程中,每插入一个结点时,首先检查是否因结点插入而破坏了树的平衡性,若是,则找出最小不平衡子树,在保持二叉排序树的特性前提下,调整最小不平衡子树中各结点的位置,进行相应旋转,使其成为新的平衡子树。

设结点 A 为最小平衡树的根结点,对该子树进行平衡调整归纳起来有以下四种情况:

1.LL 型

当新插入的结点是插在结点 A 的左孩子的左子树上,即为 LL 型。

设结点 B 是结点 A 的左子树的根结点,Bl、Br 分别为结点 B 的左右子树,Ar 为结点 A 的右子树,且 Bl、Br、Ar 三棵子树的深度均为 h,将结点 x 插入到结点 B 的左子树 Bl 上,导致结点 A 的平衡因子由 1 变为 2,使得以结点 A 为根的子树失去了平衡,如下图:

将支撑点由 A 改为 B,相应的进行顺时针旋转,旋转后,结点 A 及其右子树 Ar 和结点 B 的右子树 Br 发生冲突,按旋转优先原则,结点 A 成为 B 的右孩子结点,结点 B 的右子树 Br 成为结点 A 的左子树,如下图:

2.RR 型

当新插入的结点是插在结点 A 的右孩子的右子树上,即为 RR 型。

设结点 B 是结点 A 的右子树的根结点,Bl、Br 分别为结点 B 的左右子树,Al 为结点 A 的左子树,且 Bl、Br、Ar 三棵子树的深度均为 h,将结点 x 插入到结点 B 的右子树 Br 上,导致结点 A 的平衡因子由 -1 变为 -2,使得以结点 A 为根的子树失去了平衡,如下图:

将支撑点由 A 改为 B,相应的进行逆时针旋转,旋转后,结点 A 及其左子树 Al 和结点 B 的左子树 Bl 发生冲突,按旋转优先原则,结点 A 成为 B 的左孩子结点,结点 B 的左子树 Bl 成为结点 A 的右子树,如下图:

3.LR 型

当新插入的结点是插在结点 A 的左孩子的右子树上,即为 LR 型。

设结点 B 是结点 A 的左子树的根结点,结点 C 是结点 B 的右子树的根节点,Ar 为结点 A 的右子树,Bl 为结点 B 的左子树,Cl、Cr 分别为结点 C 的左右子树,且 Bl、Ar 两棵子树的深度为 h,Cl、Cr 两棵子树的深度为 h-1,将结点 x 插入到结点 C 的左子树 Cl 上,导致结点 A 的平衡因子由 1 变为 2,使得以结点 A 为根的子树失去了平衡,如下图:

对于 LR 型,需旋转两次:

1)第一次旋转:根节点 A 不动,调整结点 A 的左子树,将支撑点由结点 B 调整到结点 C 处,相应的进行逆时针旋转,旋转后,结点 B 及其左子树与结点 C 的左子树 Cl 发生冲突,按旋转优先原则,结点 C 的左子树成为 B 的右子树,如下图:

2)第二次旋转:将支撑点由结点 A 调整到结点 C, 相应的进行顺时针旋转,旋转后,结点 A 及其右子树 Ar 与结点 C 的右子树 Cr 发生冲突,按旋转优先原则,结点 C 的右子树成为结点 A 的左子树,如下图:

4.RL 型

当新插入的结点是插在结点 A 的右孩子的左子树上,即为 RL 型。

设结点 B 是结点 A 的右子树的根结点,结点 C 是结点 B 的左子树的根节点,Al 为结点 A 的左子树,Br 为结点 B 的右子树,Cl、Cr 分别为结点 C 的左右子树,且 Br、Al 两棵子树的深度为 h,Cl、Cr 两棵子树的深度为 h-1,将结点 x 插入到结点 C 的右子树 Cr 上,导致结点 A 的平衡因子由 -1 变为 -2,使得以结点 A 为根的子树失去了平衡,如下图:

对于 RL 型,需旋转两次:

1)第一次旋转:根节点 A 不动,调整结点 A 的右子树,将支撑点由结点 B 调整到结点 C 处,相应的进行顺时针旋转,旋转后,结点 B 及其右子树与结点 C 的右子树 Cr 发生冲突,按旋转优先原则,结点 C 的右子树成为 B 的左子树,如下图:

2)第二次旋转:将支撑点由结点 A 调整到结点 C, 相应的进行逆时针旋转,旋转后,结点 A 及其左子树 Al 与结点 C 的左子树 Cl 发生冲突,按旋转优先原则,结点 C 的左子树成为结点 A 的右子树,如下图:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值