您的位置:首页 > 其它

平衡二叉树-旋转

2016-10-25 02:22 204 查看
旋转分为左旋转与右旋转,左右旋转与右左旋转

我都在图片里表示:





//右旋转,这里传入的为图中的b点

{
Node *grandfather = father->_father;
Node *great_father = grandfather->_father;

grandfather->_left = father->_right;
if (father->_right != NULL)
father->_right->_father = grandfather;

father->_right = grandfather;
grandfather->_father = father;
//判段是否为头结点,事实上这里的头节点会被修改,你应该传入
//  root引用来修改root
if (NULL != great_father)
{
if (great_father->_left == grandfather)
great_father->_left = father;
else great_father->_right = father;
}
father->_father = great_father;
}




//father为图中b点


void rotate_left(Node *father)

{

Node *grandfather = father->_father;

Node *great_father = grandfather->_father;

grandfather->_right = father->_left;
if (father->_left != NULL)
father->_left->_father = grandfather;

father->_left = grandfather;
grandfather->_father = father;
//判段是否为头结点,事实上这里的头节点会被修改,你应该传入
//  root引用来修改root
if (NULL != great_father)
{
if (great_father->_left == grandfather)
great_father->_left = father;
else great_father->_right = father;

}
father->_father = great_father;

}






//先对b,c进行左旋,在对c,a进行右旋
void rotate_left_right(Node *father)
{
father = father->_right;
rotate_left(father);
rotate_right(father);
}




//与左右旋转同理
void rotate_right_left(Node *father)
{
father = father->_left;
rotate_right(father);
rotate_left(father);
}


**特别补充:**A, B, C, D四个点也可能表示子树。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树