コード例 #1
0
ファイル: avl.hpp プロジェクト: CS-svnmirror/evil-programmers
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;
  }
}
コード例 #2
0
ファイル: 1846_avl.cpp プロジェクト: kirankum/morbidel-timus
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;
}