AVL树的插入和删除
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A VL树的插入
再向一颗本来是高度平衡的A VL树中插入一个新节点是,如果树中的某个节点的平衡因子的绝对值|bf|>1,则出现了不平衡,需要做平衡化处理。
设新插入的节点为p,从节点p到根节点的路径上,每个节点为根的子树的高度都可能增加1,因此在每执行一次二叉搜索树的插入运算后,都需要从新插入的节点p开始,沿该节点的插入路径向根节点方向回溯,修改各节点的平衡因子,调整子树的高度,恢复被破换的平衡性质。
新节点p的平衡因子为0。现在考察它的父节点pr,若p是pr的右子女,则pr的平衡因子增加1,否则pr的平衡因子减少1,按照修改后pr的平衡因子值有三种情况:
1、节点pr的平衡因子为0,说明刚才是在pr的较矮的子树上插入了新节点,节点
pr处平衡,且高度没有增减,此时从pr到根的路径上各节点为根的子树高度
不变,从而各各节点的平衡因子不变,可以结束重新平衡化的处理,返回主程
序。
2、节点pr的平衡因子绝对值bf=1,说明插入前pr的平衡因子是0,插入新节点后,
以pr为根的子树没有失去平衡,不需要平衡化旋转,但该子树的高度增加,还
需从节点pr向根的方向回溯,继续考察节点pr的父节点的平衡状态。
3、节点pr的平衡因子的绝对值bf=2,说明新节点在较高的子树上插入,造成了
不平很,需要做平衡化旋转,分两种情况考虑:
3.1 若节点pr的bf=2,说明右子树高,结合其右子女q的bf分别处理:
1\若q的bf=1,执行左单旋转;
2\若q的bf=-1, 执行先右后左双旋转
3.2 若节点pr的bf=-2,说明左子树高,结合其左子女q的bf分别处理:
1\若q的bf=-1,执行右单旋转;
2\若q的bf= 1, 执行先左后右双旋转
A VL树的删除
若删除节点后破坏了A VL树的平衡,则需要进行平衡旋转
1、如果被删除节点p有两个子女节点,首先搜索p在中序下的直接前驱q(也可
以是直接后继),再把节点q的内容传送给节点p,问题转移到删除节点q,把节
点q当做被删除节点p,它是只有一个子女的节点。
2、如果被删除节点p最多只有一个子女q,可以简单的把p的父节点pr中原来指
向的指针该指到q,如果节点p没有子女,p父节点pr的相应指针为NULL,然
后将原来的节点pr为根的子树的高度减1,并沿pr通向根的路径反向追踪高度
的这一变化对路径上各节点的影响;
考察节点q的父节点pr,若q是pr的左子女,则pr的平衡因子增加1,否则减少1,根据修改后的pr的平衡因子,按三种情况分别进行处理:
(1)pr的平衡因子原来为0,在它的左子树或右子树被缩短后,则它的平衡因子改为
1或-1,由于以pr为根的子树高度没有改变,从pr到根节点的路径上所有节点
都不需要调整,此时可结束本次删除的重新平衡过程。
(2)节点pr的平衡因子原不为0,且较高的子树被缩短,则p的平衡因子改为0,
此时pr为根的子树平衡,但其高度减1,为此需要继续考察节点pr的父节点的
平衡状态,
(3)节点pr的平衡因子原不为0,且较矮的子树被缩短,则在节点pr发生不平衡,
为此需要进行平衡化德旋转来恢复平衡,令pr的较高的子树的根为q(该子树未被缩短),根据q的平衡因子,有3中平衡化操作
1、如果q的平衡因子为0,执行一个单旋转来恢复节点pr的平衡,由于平衡
旋转后以q为根的子树的高度没有发生改变,从q到跟的路径上所有结点的平衡因子不变,此时可以结束重新平衡过程。
2、如果q的平衡因子与pr的平衡因子正负号相同,则执行一个单旋转来恢
复平衡,节点pr和q的平衡因子均改为0,由于经过平衡旋转后节点q的子树高度降低1,故需要继续延插入路劲上考查节点q的父节点的平衡状态,即将当前考查节点向跟节点方向上移。
3、如果pr与q的平衡因子正负号相反,则执行一个双旋转来恢复平衡。新
的根节点的平衡因子置为0,其他节点的平衡因子相应处理,同时由于经过平衡化处理后子树的高度降低1,还需要考查它的父节点,继续向上层进行平衡化工作。