为了保持插入节点后平衡二叉树的平衡状态,有几种情况下需要对二叉树进行旋转的操作,主要包括单左旋、单右旋、左右双旋转和右左双旋转。下面分别介绍以作记录:
1、单左旋
插入节点在影响节点左子树的左边导致的不平衡下采用单左旋,如下图,标红的数字为新插入节点,A为被影响节点:
SingleRotateWithLeft( Tree A)
{
Tree B;
B=A->left;
A->left=B->right;
B->right=A;
A->height=Max(height(A->left),height(A->right))+1;
B->height=Max(height(B->left),A->height))+1;
return B;
}
2、单右旋
插入节点在影响节点右子树的右边采取右单旋,如下图:
SingleRotateWithRight( Tree A):代码类似2,略
3、左右双旋
插入节点在影响节点左子树的右边,要经过两次旋转,先对影响节点的左子树部分右旋,之后再对影响节点处左旋,如下图:
DoubleRotateWithLeft(Tree A)
{
/*先对A的左子树进行右旋操作,即对B和C做右旋*/
A->left=SingleRotateWithRight(A->left);
/*再对整个A做左旋操作,即对A和C做左旋*/
return SingleRotateWithLeft(A);
}
4、右左双旋
插入节点在影响节点右子树的左边,先对影响节点的右子树进行左旋,再对影响节点做右旋操作,如下图:
代码类似3,略;