_bb_tree.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:2k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _bb_tree.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/impl/bb_tree.h>
  12. //----------------------------------------------------------------------------
  13. //  bb_tree:
  14. //
  15. //  rebalancing routines for BB[alpha] trees
  16. //
  17. //----------------------------------------------------------------------------
  18. void bb_tree::rebal(bb_tree_item v, int delta)
  19. {
  20.   while ( v != root() )
  21.   { 
  22.     bb_tree_item u = v->parent;
  23.     bb_tree_item l = u->child[left];
  24.     bb_tree_item r = u->child[right];
  25.     int bu  = u->get_bal() + delta;      // increase/decrease weight of u
  26.     int bl  = l->get_bal();
  27.     int br  = r->get_bal();
  28.     u->set_bal(bu);
  29.     if (64*bl < bu*alpha)
  30.        { int brl = r->child[left]->get_bal();
  31.          if (64*brl <=  d * br) 
  32.             { rotation(u,r,right);
  33.               r->set_bal(bu);
  34.               u->set_bal(bl + brl);
  35.               v = r;
  36.              }
  37.          else 
  38.             { bb_tree_item w = r->child[left];
  39.               int bwl = w->child[left]->get_bal();
  40.               double_rotation(u,r,w,right);
  41.               w->set_bal(bu);
  42.               u->set_bal(bl + bwl);
  43.               r->set_bal(br - bwl);
  44.               v = w;
  45.              }
  46.         }
  47.     else 
  48.        if (64*br < bu*alpha) 
  49.        { int bll = l->child[left]->get_bal();
  50.          if (64*bll >  d * bl) 
  51.               { rotation(u,l,left);
  52.                 l->set_bal(bu);
  53.                 u->set_bal(bu - bll);
  54.                 v = l;
  55.                }
  56.    else 
  57.               { bb_tree_item w = l->child[right];
  58.                 int bwr = w->child[right]->get_bal();
  59.                 double_rotation(u,l,w,left);
  60.                 w->set_bal(bu);
  61.                 u->set_bal(br + bwr);
  62.                 l->set_bal(bl - bwr);
  63.                 v = w;
  64.                }
  65.         }
  66.         else v = u;
  67.        
  68.    }
  69. }
  70. void bb_tree::insert_rebal(bb_tree_item v) { rebal(v,1); }
  71. void bb_tree::del_rebal(bb_tree_item v, bb_tree_item) { rebal(v,-1); }