平衡二叉树-旋转
2016-10-25 02:22
204 查看
旋转分为左旋转与右旋转,左右旋转与右左旋转
我都在图片里表示:
//右旋转,这里传入的为图中的b点
void rotate_left(Node *father)
{
Node *grandfather = father->_father;
Node *great_father = grandfather->_father;
**特别补充:**A, B, C, D四个点也可能表示子树。
我都在图片里表示:
//右旋转,这里传入的为图中的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四个点也可能表示子树。