平衡二叉树的插入旋转操作

时间:2021-07-13 17:26:51

为了保持插入节点后平衡二叉树的平衡状态,有几种情况下需要对二叉树进行旋转的操作,主要包括单左旋、单右旋、左右双旋转和右左双旋转。下面分别介绍以作记录:

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,略;

上述双旋的代码仅针对某些特殊情形,如3树A必须有左子树而且这个左子树必须有右子树,后续是否有更完整的还有待我去学习