template <class D> AVL_RES avl_tree<D>::rightshrunk(avl_node<D> **node) { switch((*node)->skew) { case AVL_RIGHT: (*node)->skew=AVL_NONE; return AVL_BALANCE; case AVL_LEFT: if((*node)->left->skew==AVL_LEFT) { (*node)->skew=(*node)->left->skew=AVL_NONE; rotright(node); return AVL_BALANCE; } else if((*node)->left->skew==AVL_NONE) { (*node)->skew=AVL_LEFT; (*node)->left->skew=AVL_RIGHT; rotright(node); return AVL_OK; } else { switch((*node)->left->right->skew) { case AVL_LEFT: (*node)->skew=AVL_RIGHT; (*node)->left->skew=AVL_NONE; break; case AVL_RIGHT: (*node)->skew=AVL_NONE; (*node)->left->skew=AVL_LEFT; break; default: (*node)->skew=AVL_NONE; (*node)->left->skew=AVL_NONE; } (*node)->left->right->skew=AVL_NONE; rotleft(&(*node)->left); rotright(node); return AVL_BALANCE; } default: (*node)->skew=AVL_LEFT; return AVL_OK; } }
struct node *rotate(struct node *n) { if (n == NIL) return n; if (n->l->height > n->r->height+1) { if (n->l->r->height > n->l->l->height) n->l = rotright(n->l); n = rotleft(n); } else if (n->r->height > n->l->height+1) { if (n->r->l->height > n->r->r->height) n->r = rotleft(n->r); n = rotright(n); } computegcd(n); return n; }