平衡二叉树

平衡二叉树

0x00 什么是平衡二叉树

​ 在上一节二叉搜索树中,可以发现,相同的节点集合不同的插入次序,将导致树的形状和高度不一样,导致在查找是的平均长度不一样

TIM截图20200204104617

为了描述树的节点分布均匀程度,引入平衡因子这一概念:

平衡因子(balance factory 简称BF):BF=HL-HR

​ 其中hl和hr分别为T的左子树 右子树的高度

根据平衡因子,我们定义平衡二叉树:

平衡二叉树(balance binary tree) (avl树):空树或者任一节点的平衡因子绝对值小于1.

TIM截图20200204105243

0x01 平衡二叉树性质

我们知道对于满二叉树而言,n层的节点数为2^n-1,故可知n个节点的树高近似log2n,而通过归纳法,我们也可以知道n个节点的平衡二叉树树高也近似为log2n

TIM截图20200204105449

故可知平衡二叉树插入查找删除操作的时间复杂度均为O(logn)

0x02 平衡二叉树的调整

​ 对于一棵平衡二叉树,插入一个节点后,可能会破坏其平衡,如果不及时调整,会随着节点的增多,平衡因子越来也大,查找效率越来越低。

​ 在这里,把受到插入节点影响,平衡因子大于1的最靠近插入节点的那个节点称为发现者,把插入节点称为麻烦节点,根据二者的位置关系,分以下四种情况讨论:

​ RR调整:

TIM截图20200204110711

如果是下面这种情况,那么除了旋转外还要调整中间节点的子树的位置:

TIM截图20200204111011

上面的调整不是很难,类似的下面三种调整思路由图片给出,代码将在下一节实现。

TIM截图20200204111123

TIM截图20200204111202

TIM截图20200204111220