1.引言
对一棵查找树(search tree)进行查询/新增/删除 等动作, 所花的时间与树的高度h 成比例, 并不与树的容量 n 成比例。如果可以让树维持矮矮胖胖的好身材, 也就是让h维持在O(lg n)左右, 完成上述工作就很省时间。能够一直维持好身材, 不因新增删除而长歪的搜寻树, 叫做balanced search tree(平衡树)。
本节我们讲解如何修改根插入,让旋转操作在一定意义上平衡树,通过旋转将新插入节点带到根,按这种方式生成的BST就是分裂BST。
2.旋转
a>右旋转
基于S点的右旋操作:
1>S初下移,作为左孩子的右链接;
2>S的左链接得到新根E的链接;将E的右链接设置成S;并设置A的右链接指向E;
旋转的作用是将E及其左子树上移一层;将S及其右子树下移一层;树的余下部分没有受影响;在经过旋转之后以*S和*E为根的新子树为平衡二叉树,而且它的深度和插入之前以*A为根的子树相同。因此平衡的二叉树因插入节点而失去平衡时,仅需对最小不平衡子树进行平衡旋转处理即可。因为经过旋转处理之后的子树深度和插入之前相同,因而不影响插入路径上所有祖先节点的平衡度。
b>左旋转