- 作者:邹祁峰
- 邮箱:Qifeng.zou.job@hotmail.com
- 博客:http://blog.csdn.net/qifengzou
- 日期:2013.12.20 12:00
- 转载请注明来自"祁峰"的CSDN博客
1 前言
在之前的博文《算法导论 之 平衡二叉树 - 插入》和《算法导论 之 平衡二叉树 - 打印》中已经给出了创建、插入、查询、打印以及销毁平衡二叉树的C语言实现过程,在此篇中出现的一些结构体、宏、枚举、函数等相关定义可以到以上两篇中找到。之所以现在才来写平衡二叉树的删除操作,主要是其过程相对比较复杂,且测试和实现过程中出现了各种各样的问题。
2 处理思路
2.1 被删的结点是叶子结点
处理思路:
①、将该结点直接从树中删除;
②、其父节点的子树高度的变化将导致父结点平衡因子的变化,通过向上检索并推算其父结点是否失衡;
③、如果其父结点未失衡,则继续向上检索推算其父结点的父结点是否失衡...如此反复②的判断,直到根结点;如果向上推算过程中发现了失衡的现象,则进行④的处理;
④、如果其父结点失衡,则判断是哪种失衡类型[LL、LR、RR、RL],并对其进行相应的平衡化处理。如果平衡化处理结束后,发现与原来以父节点为根结点的树的高度发生变化,则继续进行②的检索推算;如果与原来以父结点为根结点的高度一致时,则可说明父结点的父结点及祖先结点的平衡因子将不会有变化,因此可以退出处理;[注意:删除操作时的LL和RR型与插入操作的LL和RR型的判断有一点小区别,那就是删除操作中,当node->lchild或node->rchild的平衡因子为AVL_EH时,也进行LL或RR操作]
举例说明:
假设现在要删除叶子结点D,如图1所示。首先,将D从树中删除,再判断其父结点C是否失衡,如果失衡则进行平衡化处理;再判断C的父结点B是否失衡,如果失衡则进行平衡化处理;再判断B的父结点A是否失衡,如果失衡则....依此类推,直到根结点或高度不再变化为止。
图1 叶子结点
2.2 被删的结点只有左子树或只有右子树
处理思路:
①、将左子树(右子树)替代原有结点C的位置;
②、结点C被删除后,则以C的父结点B为起始推算点,依此向上检索推算各结点(父、祖先)是否失衡;
<