树旋转(Tree rotation)是二叉树中的一种子树调整操作,每一次旋转并不影响对该二叉树进行中序遍历的结果。
树旋转通常应用于需要调整树的局部平衡性的场合。
>>左旋和右旋
树的旋转有两种基本的操作,即左旋(逆时针方向旋转)和右旋(顺时针方向旋转)。
树旋转包括两个不同的方式,分别是左旋转(以P为转轴)和右旋转(以Q为转轴)。两种旋转呈镜像,而且互为逆操作。
下图示意了两种树旋转过程中, 子树的初态和终态
+---+ +---+ | Q | | P | +---+ +---+ / \ right rotation / \ +---+ +---+ -------------> +---+ +---+ | P | | Z | | X | | Q | +---+ +---+ <------------- +---+ +---+ / \ left rotation / \ +---+ +---+ +---+ +---+ | X | | Y | | Y | | Z | +---+ +---+ +---+ +---+其中, 右旋转详细步骤如下图 R0, R1, R2 三个步骤所示, 左旋转则如 L0, L1, L2 三个步骤所示.
__ / \ +---+ / +---+ | Q | / | Q | +---+ +---+ +---+ / +---+ +---+ | P | / \ R1 | P |/ / \ +---+ | Q | R0 +---+ / +---+ -----> +---+ / +---+ R2 | P | +---+ -----> / \ / | Z | / / | Z | -----> +---+ / \ +---+ +---+ +---+ +---+ +---+ +---+ / \ +---+ +---+ | X | | Y | | X | | Y | +---+ +---+ | P | | Z | +---+ +---+ +---+ +---+ | X | | Q | +---+ +---+ __ +---+ +---+ / \ / \ / \ +---+ +---+ L2 +---+ \ +---+ L0 +---+ +---+ | X | | Y | <----- | P | \ | P | <----- | Y | | Z | +---+ +---+ +---+ \ +---+ L1 +---+ +---+ +---+ +---+ / \ \| Q | <----- / \ | Q | +---+ \ +---+ +---+ \ +---+ | X | \ \ | X | \ / \ +---+ +---+ +---+ +---+ +---+ +---+ | Y | | Z | | Y | | Z | +---+ +---+ +---+ +---+
>>AVL树的调整
AVL树的基本操作一般涉及运作同在不平衡的二叉查找树所运作的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL旋转"。
本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/5242354.html,如需转载请自行联系原作者