在很多的数据结构书上,关于avl树,都有记录如何进行插入节点以及如何进行树的翻转操作。但对于,如何删除节点,却都是作为练习或者没有提供相应的代码以供参考。笔者,根据插入节点的实现,并部分参考网上其它c++代码,提出一个简单的删除节点的实现,并记录如下。
删除一个节点的主要步骤如下所示:
- 如果是null节点,则直接返回null
- 如果删除的值<当前节点,则转入left节点进行递归删除
- 如果删除的值>当前节点,则转入right节点进行递归删除
- 如果删除的值为当前节点,如果当前节点只有一个子树,则直接返回该子树
- 如果删除的值为当前节点,且当前节点有两个子树,则将当前值更改为右子树中最小的节点值,并递归在右子树中删除该节点值
- 重新修正该处理节点的height值
- 对处理节点进行重新翻转处理,以修正在删除过程中可能出现的树不平衡情况
经过以上的逻辑,那么实现代码就不那么困难了。简单实现如下所示: