本文简要的实现了平衡二叉树的插入、删除操作。为了更新节点的平衡度,新增了parent指针。
简介
这个平衡二叉树使用C语言实现的,因为写的匆忙,加上智商捉急,可能某些地方没有考虑周全,会有一点小bug,尚在排查中。本算法能基本的实现平衡二叉树的插入、删除操作,有关平衡二叉树的原理及实现,参考AVL树(一)之 图文解析 和 C语言的实现。这位博主讲解的非常详细!!虽然他给的代码中有一些错误,但从他的博文中,我受益良多,并且重写了这个AVL树,在此表示感谢 _ .
数据结构
这里的parent指针很重要,它可以在平衡二叉树删除算法的调整过程中,起着很大的作用。有一点需要注明的是,那位博主的删除算法有误,选用的数据结构也不太合理。。
1 | typedef int DataType; |
基本思想
插入过程
我就不想说了,无非LL、LR、RL、RR型的旋转操作。想在这里记录一下:
删除算法的过程
1、若该节点有左右孩子
那么就用它的后继孩子节点替换该节点。假如本来删除的节点为node,它的左右孩子均非空,这时就用它的后继节点successor作为要删除的节点,即将successor节点的值赋给node,再删掉successor节点,因为这样需要调整的节点会少。
2、若该节点只有1个或0个孩子
直接删掉它。
关于调整过程:
对删除节点的父节点开始调整,更新其depth,并且向根节点开始迭代。计算每个父节点的左右子树的平衡差diff_depth,若为2则启动调整算法。
调整算法
基于四个调整操作,即LL、LR、RL、RR旋转。具体怎么旋转,参见那篇博文,灰常详细。
平衡二叉树C实现
1 |
|
运行结果
总结
理论与实践结合真的很重要,从书本上看这些算法没什么难的,自己动手写了一遍却被虐成了狗,同时也深深的敬佩提出这些算法的大牛们,佩服遇到问题时这么巧妙、这么机智的解决。
还有一点是,在于指针打交道的过程中,遇到段错误真是再平常也不过了。GDB真是一个你用了就会爱上它的好东西,解决段错误真是一大利器 _ 。