自平衡二叉搜索树

2020-07-16 Algorithm Structure

为了保证树的高度,也就出现了如下的平衡二叉树,例如 AVL Tree、Red-Black Tree 等,两者都是针对可能出现的不同场景进行调整,从而达到了平衡状态,但是两者处理不平衡状态都不太好记忆,而且死板。

这里先介绍下自平衡二叉树的实现。

简介

自平衡二叉查找树 (AVL Tree) 中任意节点的两个子树的高度差最大为 1,查找、插入和删除在平均和最坏情况下都是 O(log n),插入和删除可能需要通过一次或多次树旋转来重新平衡这个树。

该平衡二叉树得名于其发明者 G.M. Adelson-Velsky 和 E.M. Landis,在 1962 年的论文《An algorithm for the organization of information》有相关的介绍。

相比红黑树来说 AVL 树要更加平衡一些,带来的问题就是插入和删除比较慢,但是查询的速度会更快一些。

平衡因子

每个节点会保存树的高度信息,当前节点高度会选择左右节点较高的值加一计算得到,然后每个节点可以根据高度计算一个平衡因子 (Balance Factor),可以采用左子树的高度减去右子树的高度。

当平衡因子为 10-1 时,该节点被认为是平衡的,而 -22 的节点被认为是不平衡,就需要重新平衡这个树。

为了保持平衡,AVL Tree 可能需要执行四种的旋转方式。

旋转

旋转的逻辑很简单,每次旋转完之后需要更新节点的高度,介绍如下。

向左旋转

此时右侧不平衡,需要向左旋转。

avl tree left rotation

向右旋转

此时左侧不平衡,需要向右旋转。

avl tree right rotation

左右旋转

avl tree left right rotation

右左旋转

avl tree right left rotation

总结

实际实现只需要向左和向右旋转即可,而左右、右左旋转直接调用上述的接口即可。