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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _ab_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/ab_tree.h>
  12. //---------------------------------------------------------------
  13. //  
  14. //  Michael Wenzel:
  15. //  function insert_at_item added
  16. //
  17. //  double links between leaf and inner node with same key
  18. //
  19. //  delete overwrites copies of keys in inner nodes
  20. //
  21. //  leafs are nodes of degree 1, linked by son[1], son[2]
  22. //
  23. //---------------------------------------------------------------
  24. //------------------------------------------------------------------
  25. // constructors
  26. //------------------------------------------------------------------
  27. ab_tree_node::ab_tree_node(int p_,int height_,int index_,ab_tree_node* father_,int b)
  28. {
  29.     son  = (ab_tree_node**) allocate_words(b+2);   /* array[1..b+1] */
  30.     k    = (GenPtr*) allocate_words(b+1);             /* array[1..b]   */
  31.     same = (ab_tree_node**) allocate_words(b+1);   /* array[1..b]   */
  32.     // position 0 contains the size of the array:
  33.     son[0]  = (ab_tree_node*)(Convert(b+2));
  34.     k[0]    = (GenPtr)(Convert(b+1));
  35.     same[0] = (ab_tree_node*)(Convert(b+1));
  36.     p=p_;
  37.     height=height_;
  38.     index=index_;
  39.     father=father_;
  40.     int i;
  41.     for(i=1;i<=(b+1);son[i++]=0);
  42.     for(i=1;i<=b;k[i++]=0);
  43.     for(i=1;i<=b;same[i++]=0);                
  44.    }
  45.  ab_tree_node::~ab_tree_node() 
  46.  { deallocate_words(son,*(int*)son);    // first element gives size 
  47.    deallocate_words(same,*(int*)same);
  48.    deallocate_words(k,*(int*)k);
  49.   }
  50.  ab_tree::ab_tree(int a_,int b_)
  51.  {
  52.    root=maximum=minimum=0;
  53.    count=0;
  54.    height=-1;
  55.    if((a_>=2)&&(b_>=2*a_-1))
  56.     { a=a_;
  57.       b=b_;
  58.      }
  59.    else error_handler(1,"ab_tree: illegal arguments (a,b) in tree constructor");
  60.  }
  61.  ab_tree::ab_tree(const ab_tree& T)
  62.   {
  63.      if (T.root==0) {root=maximum=minimum=0;height=-1;count=0;}
  64.      else { abnode help=0;
  65.     root = T.copy_ab_tree(T.root,help,T.b);
  66.             maximum=help;
  67.             help=root;
  68.             while (help->p) help=help->son[1];
  69.     minimum=help;
  70.             height=T.height;
  71.             count=T.count;
  72.           };
  73.      a=T.a;
  74.      b=T.b;
  75.   }
  76. //-----------------------------------------------------------------
  77. // operators
  78. //-----------------------------------------------------------------
  79.  ab_tree& ab_tree::operator=(const ab_tree& T)
  80.   {  if (this == &T) return *this;
  81.      clear();
  82.      if (T.root!=0) 
  83.      { abnode help=0;
  84.        root=copy_ab_tree(T.root,help,T.b);
  85.        maximum=help;
  86.        help=root;
  87.        while (help->p) help=help->son[1];
  88.        minimum=help;
  89.        height=T.height;
  90.        count=T.count;
  91.       };
  92.      a=T.a;
  93.      b=T.b;
  94.      return *this;
  95.   }
  96. //-----------------------------------------------------------------
  97. // member functions
  98. //-----------------------------------------------------------------
  99. void ab_tree::exchange_leaves(ab_tree_node* v, ab_tree_node* w)
  100. { // exchange leaves v and w
  101.   GenPtr k1 = v->k[1]; 
  102.   int p1 = v->index;
  103.   ab_tree_node* u1 = v->same[1];
  104.   ab_tree_node* f1 = v->father;
  105.   GenPtr k2 = w->k[1]; 
  106.   int p2 = w->index;
  107.   ab_tree_node* u2 = w->same[1];
  108.   ab_tree_node* f2 = w->father;
  109.   f1->son[p1] = w;
  110.   w->index    = p1;
  111.   w->same[1]  = u1;
  112.   w->father   = f1;
  113.   f2->son[p2] = v;
  114.   v->index    = p2;
  115.   v->same[1]  = u2;
  116.   v->father   = f2;
  117.   ab_tree_node* pred1 = v->son[1];
  118.   ab_tree_node* succ1 = v->son[2];
  119.   ab_tree_node* pred2 = w->son[1];
  120.   ab_tree_node* succ2 = w->son[2];
  121.   w->son[1] = pred1;
  122.   if (pred1) pred1->son[2] = w;
  123.   if (succ1!=w) 
  124.   { w->son[2] = succ1;
  125.     succ1->son[1] = w;
  126.    }
  127.   if (pred2==v) pred2 = w;
  128.   v->son[1] = pred2;
  129.   v->son[2] = succ2;
  130.   pred2->son[2] = v;
  131.   if (succ2) succ2->son[1] = v;
  132.   // minimum & maximum:
  133.   if (v==minimum) minimum = w;
  134.   if (w==maximum) maximum = v;
  135.   // overwrite inner copies:
  136.   
  137.   int pos1=1;
  138.   while(u1->same[pos1]!=v) pos1++;
  139.   int pos2=1;
  140.   if (u2) while(u2->same[pos2]!=w) pos2++;
  141.   u1->k[pos1] = k2;
  142.   u1->same[pos1] = w;
  143.   if (u2) 
  144.   { u2->k[pos2] = k1;
  145.     u2->same[pos2] = v;
  146.    }
  147. }
  148. void ab_tree::reverse_items(ab_tree_node* v, ab_tree_node* w)
  149. { // reverse sequence of leaves: v, ..., w
  150.   if (v==w) return;
  151. /*
  152.   if (cmp(v->k[1],w->k[1])<0) 
  153.   { newline;
  154.     cout << "a = "; print_key(v->k[1]); newline;
  155.     cout << "b = "; print_key(w->k[1]); newline;
  156.     error_handler(1,"ab_tree: illegal reverse_items(a,b)n");
  157.    }
  158. */
  159.   ab_tree_node* u;
  160.   for(;;)
  161.   { exchange_leaves(v,w);
  162.     u = pred(v);
  163.     if (u == w) break;
  164.     v = succ(w);
  165.     if (v==u) break;
  166.     w = u;
  167.    }
  168. }
  169.  void ab_tree::clear()
  170.  { if (root!=0) del_tree(root);
  171.    maximum=minimum=root=0;
  172.    count = 0;
  173.    height=-1;
  174.   }
  175.  void ab_tree::del(GenPtr key)
  176.  { if (!root) return;                      // s.n.
  177.    ab_tree_node* w=locate(key);
  178.    if(w && cmp(w->k[1],key) == 0)  del_item(w);
  179.    else /* error_handler(1,"ab_tree: del(key):key is not in tree") */;
  180.  }
  181. ab_tree_node* ab_tree::expand(ab_tree_node* v,int i)
  182. // expand v by returning an additional son to the right of w
  183. // --> w is the i-th son of v
  184. // s.n.: if i==0 then  new leftmost son
  185. // expand does not test a<=number of sons(v)<=b
  186. // m.w. expand does not set same links for new leaves
  187.  {
  188.    // move the nodes right to w to give an additional son to 
  189.    // the right of w
  190.    int l=(v->p);
  191.    if (i < l)
  192.    {
  193.      v->son[l+1]=v->son[l];
  194.      v->son[l+1]->index=l+1;
  195.      l--;
  196.     }
  197.    while(i < l) 
  198.    { 
  199.      v->k[l+1] = v->k[l];
  200.      v->same[l+1] = v->same[l];
  201.      v->son[l+1]=v->son[l];
  202.      v->son[l+1]->index=l+1;
  203.      l--;
  204.     };
  205.    if (v->height>1)
  206.       v->son[i+1] = new ab_tree_node(0,v->height-1,i+1,v,b);
  207.    else  
  208.       v->son[i+1] = new ab_tree_node(0,v->height-1,i+1,v,1);
  209.    (v->p)++;
  210.    return v->son[i+1];
  211. }                     
  212.                      
  213. void ab_tree::split_node(ab_tree_node* v)
  214. {
  215.  /* adding a child increases the degree of v by 1. If v->p<=b after
  216.     adding the new leave, then we are done . Otherwise we have to 
  217.     split v. Splitting can propagate ==> Loop 
  218.     m.w. changes same links between nodes                          */
  219.   ab_tree_node* y;
  220.   while (v->p==b+1) 
  221.   {
  222.     if (v!=root)  y = v->father;
  223.     else 
  224.     { y=new ab_tree_node(1,v->height+1,0,0,b);
  225.       root=y;height++;
  226.       y->son[1]=v;
  227.       v->index=1;
  228.       v->father=y;
  229.      };
  230.     register ab_tree_node* u;
  231.     u = expand(y,v->index);   // u <-- new right brother of v
  232.     int down =(int)((b+1)/2) ;
  233.     int up = (b+1)- down;
  234.     if (u->index <= b)
  235.     { y->k[u->index] = y->k[v->index];
  236.       y->same[u->index] = y->same[v->index];
  237.      }
  238.     y->k[v->index] = v->k[down];
  239.     y->same[v->index]  = v->same[down];
  240.     y->same[v->index]->same[1] = y;    
  241.  
  242.     // split v, i.e. take the rightmost (b+1)/2 children and keys
  243.     // away from v and incorporate them into u and store key v->k[(b+1)/2]
  244.     // in y ( = father(v))  between the pointers to v and u i.e. at position
  245.     // v->index
  246.     // m.w. change same links of v to y and u
  247.     register int j;
  248.     for (j=1;j<up;j++)    
  249.     {
  250.       u->son[j] = v->son[down+j];
  251.       u->son[j]->index=j;
  252.       u->son[j]->father=u;
  253.       u->k[j] = v->k[down+j];
  254.       u->same[j] = v->same[down+j]; 
  255.       u->same[j]->same[1] = u;      
  256.       v->son[down+j] = 0;      // muss das sein ?
  257.       v->same[down+j] = 0;          
  258.       v->k[down+j] = 0;
  259.      };
  260.     u->son[up]=v->son[b+1];
  261.     u->son[up]->index=up;
  262.     u->son[up]->father=u;
  263.     v->son[b+1] = 0;          // und das?
  264.     v->same[down] = 0;                 
  265.     v->k[down] = 0;
  266.     v->p = down;             // change number of children
  267.     u->p = up;
  268.     v = y;
  269.   }
  270. }
  271. ab_tree_node* ab_tree::insert(GenPtr key, GenPtr inf)
  272. {
  273.  if (root==0) { root=new ab_tree_node(0,0,0,0,1);
  274.                 copy_key(key);
  275.                 copy_inf(inf);
  276.                 root->inf = inf;
  277.                 root->k[1]= key;
  278.                 height=0;
  279.                 maximum=minimum=root;
  280.                 count++;
  281.                 return root;
  282.                }
  283.  // insert_at_item calls copy_key & copy_inf
  284.  ab_tree_node* p = locate(key);
  285.  if (p==nil) p = maximum;
  286.  return insert_at_item(p,key,inf);
  287. }
  288. ab_tree_node* ab_tree::insert_at_item(ab_tree_node* w, GenPtr key, GenPtr inf)
  289.   // insert a new item (key,inf) left or right of leaf w  (according to key(w))
  290.    copy_inf(inf);
  291.    ab_tree_node* v;
  292.     if (cmp(w->k[1],key)!=0)
  293.     {
  294.       copy_key(key);
  295.      if ( w!=minimum && cmp(w->son[1]->k[1],key) > 0)
  296.       { cout << "INSERT_AT: WRONG POSITIONn";
  297.         cout << "insert:   key = "; print_key(key); cout << "n";
  298.         if (w!=maximum) 
  299.            cout << "succ-pos: key = "; print_key(w->son[2]->k[1]); cout << "n";
  300.         cout << "position: key = "; print_key(w->k[1]); cout << "n";
  301.         cout << "pred-pos: key = "; print_key(w->son[1]->k[1]); cout << "n";
  302.         error_handler(1,"ab_tree::insert_at : wrong position "); 
  303.        }
  304.      if ( w!=maximum && cmp(w->son[2]->k[1],key) < 0)
  305.       { cout << "INSERT_AT: WRONG POSITIONn";
  306.         cout << "insert:   key = "; print_key(key); cout << "n";
  307.         cout << "succ-pos: key = "; print_key(w->son[2]->k[1]); cout << "n";
  308.         cout << "position: key = "; print_key(w->k[1]); cout << "n";
  309.         if (w!=minimum)
  310.            cout << "pred-pos: key = "; print_key(w->son[1]->k[1]); cout << "n";
  311.         error_handler(1,"ab_tree::insert_at : wrong position "); 
  312.        }
  313.         count++;
  314.         if (root==w) {   v=new ab_tree_node(2,1,0,0,b);
  315.                          root=v;height=1;
  316.                          ab_tree_node* u;
  317.                          if (cmp(key,w->k[1])<0)
  318.                              {   
  319.                                  u=new ab_tree_node(0,0,1,v,1);
  320.                                  v->son[1]=u;u->k[1]=key; u->inf=inf;
  321.                                  v->son[2]=w ;
  322.                                  v->p=2;v->k[1]=u->k[1];
  323.  u->same[1] = v;
  324.                                  v->same[1] = u;
  325.  w->index=2;
  326.                                  minimum=u;
  327.                                  u->son[2] = w;
  328.                                  w->son[1] = u;
  329.                              }
  330.                          else {
  331.                                  u=new ab_tree_node(0,0,2,v,1);
  332.                                  v->son[1]=w;
  333.  w->same[1] = v;
  334.                                  v->same[1] = w;
  335.                                  v->son[2]=u;u->k[1]=key; u->inf=inf;
  336.                                  v->p=2;v->k[1]=w->k[1];
  337.                                  w->index=1; 
  338.                                  maximum=u;
  339.                                  w->son[2] = u;
  340.                                  u->son[1] = w;
  341.                               }
  342.                          w->father=v;
  343.                          return u;
  344.                       }; 
  345. if ((w!=maximum) && (cmp(key,w->k[1])>0)) w=w->son[2];
  346.         ab_tree_node* u;
  347.         int index1 = w->index;
  348.         v = w->father;
  349.         if (cmp(key,w->k[1])<0)
  350.         { u = expand(v,index1-1);   // new son u left of w
  351. /*
  352.                  v
  353.               /  |  
  354.                 (u)  w  
  355. */
  356.           u->k[1] = key;
  357.           u->inf = inf;
  358.           u->son[2] = w;
  359.           u->son[1] = w->son[1];
  360.           w->son[1] = u;
  361.   u->same[1] = v;        
  362.           v->k[index1] = key;
  363.           v->same[index1] = u ;  
  364.           if (minimum == w)  
  365.              minimum=u;
  366.           else 
  367.              u->son[1]->son[2] = u;
  368.          }
  369.         else 
  370.         { u = expand(v,index1);   // new son u right of w
  371. /*
  372.                  v
  373.               /  |  
  374.              w  (u)     
  375. */
  376.           u->k[1] = key;
  377.           u->inf = inf;
  378.           u->son[1] = w;
  379.           u->son[2] = w->son[2];
  380.           w->son[2] = u;
  381.           if (maximum == w)  
  382.           {
  383.             maximum=u;
  384.             v->k[index1] = w->k[1];
  385.     w->same[1] = v;        
  386.     v->same[index1] = w ;  
  387.            }
  388.           else
  389.           {
  390.             v->k[index1+1] = key;
  391.     u->same[1] = v;        
  392.     v->same[index1+1] = u ;  
  393.             u->son[2]->son[1] = u;
  394.            }
  395.          }
  396.         if (v->p > b) split_node(v);
  397.         return u;
  398.       }
  399.    else { clear_inf(w->inf);
  400.           w->inf = inf; 
  401.           return w;
  402.          }
  403.    }
  404. ab_tree_node* ab_tree::locate(GenPtr key) const
  405.    {
  406.   /* searching for an element key in a (a,b)-tree ;
  407.    we search down the tree starting at the root r until we reache 
  408.    a leave. In each node v we use the sequence k[1](v),..k[v->p-1](v) 
  409.    in order to guide the search to the proper subtree.In the the
  410.    function we assume that k[0](v)<key<k[v->p](v) for every
  411.    element key in U
  412.    locate returns a pointer to a leave*/ 
  413.   if (root == nil) return nil;
  414.   ab_tree_node* v = root;
  415.   GenPtr*       K = v->k;
  416.   int   child_num = v->p;
  417.   if (int_type())
  418.       while (child_num)  // while v is not a leave
  419.       { int i;
  420.         for(i=1; i < child_num && long(key) > long(K[i]); i++); 
  421.         v=v->son[i];
  422.         K=v->k;
  423.         child_num = v->p;
  424.        }
  425.    else
  426.       while (child_num)
  427.       { int i = 1;
  428.         while(i < child_num && cmp(key,K[i]) > 0) i++; 
  429.         v=v->son[i];
  430.         K=v->k;
  431.         child_num = v->p;
  432.        }
  433.   return (cmp(key,v->k[1]) <= 0) ? v : nil;
  434. }
  435. ab_tree_node* ab_tree::locate_succ(GenPtr key) const
  436. { ab_tree_node* v = locate(key);
  437.   if (v==0) return maximum;
  438.   if (cmp(key,v->k[1])==0) return v;
  439.   return v->son[1];
  440.  }
  441. ab_tree_node* ab_tree::locate_pred(GenPtr key) const
  442. { ab_tree_node* v = locate(key);
  443.   if (v==0) return maximum;
  444.   if (cmp(key,v->k[1])==0) return v;
  445.   return v->son[1];
  446.  }
  447. ab_tree_node* ab_tree::lookup(GenPtr k) const 
  448. { ab_tree_node* p = locate(k);
  449.   if (p && cmp(k,key(p))!=0 ) p = 0;
  450.   return p;
  451.  }
  452. void ab_tree::fuse(ab_tree_node* v,ab_tree_node* y)
  453.    {
  454.    /* fuse v and y, i.e. make all sons of y to sons of v and move all
  455.       keys from y to v and delete node y; also move one key (the key
  456.       between the pointers to y and v) from z to v; (note that this will
  457.       shrink z, i.e. decrease the arity of z by one)  
  458.    */
  459.    ab_tree_node* z=v->father;
  460.    GenPtr hilf=z->k[v->index] ;     /* before k[v->p] was not used {=0}*/
  461.               /* 
  462.                  we only must copy the pointer of son and the node-keys
  463.                  from y to v
  464.               */
  465.       /* change same-pointer of y and z                     */
  466.    v->k[v->p]=hilf; 
  467.    v->same[v->p]=z->same[v->index];  
  468.    v->same[v->p]->same[1] = v;       
  469.    int i;
  470.    for(i=1;i<y->p;i++) {  v->k[v->p+i]=y->k[i];
  471.       v->same[v->p+i]=y->same[i];    
  472.       v->same[v->p+i]->same[1]=v;    
  473.                               v->son[v->p+i]=y->son[i];
  474.                               v->son[v->p+i]->index=v->p+i;
  475.                               v->son[v->p+i]->father=v;
  476.                            };
  477.    v->son[v->p+y->p]=y->son[y->p];   /* copy of the last son from y*/
  478.    v->son[v->p+y->p]->index=v->p+y->p;
  479.    v->son[v->p+y->p]->father=v;
  480.    v->p=v->p+y->p;
  481.    for(i=v->index;i<z->p;i++) { z->k[i]=z->k[i+1];
  482. z->same[i] = z->same[i+1]; 
  483.                                 z->son[i+1]=z->son[i+2];
  484.                                 if (z->son[i+1]!=0){z->son[i+1]->index=i+1; 
  485.                                 z->son[i+1]->father=z;};
  486.                                };
  487.    z->p--;
  488.    z->k[z->p]=0;      
  489.    z->same[z->p]=0;   
  490.    delete y;
  491.    
  492.   }
  493.  void ab_tree::share(ab_tree_node* v,ab_tree_node* y,int direct)
  494.  {
  495.   /* we assume that y is the right brother of v;
  496.      take the leftmost son away from y and make it an additional(right-
  497.      most) son of v; also move one key( the key between the pointers
  498.      to v and y) from z down to v and replace it by the leftmost
  499.      key of y;    
  500.      the other case is equivalent
  501.      let z be the father of v
  502.    */
  503.      ab_tree_node* z=v->father;
  504.      if (direct==1)  { 
  505.                        v->son[v->p+1]=y->son[1];
  506.                        v->son[v->p+1]->index=v->p+1;
  507.                        v->son[v->p+1]->father=v;
  508.                        v->k[v->p]=z->k[v->index];
  509.        v->same[v->p]=z->same[v->index];   
  510.                        v->same[v->p]->same[1] = v;    
  511.                        z->k[v->index]=y->k[1];
  512.                        z->same[v->index]=y->same[1];      
  513.        z->same[v->index]->same[1]=z;      
  514.                        v->p++;    
  515.                        for(int i=1;i<(y->p)-1;i++) 
  516.                        { y->son[i]=y->son[i+1];
  517.                          y->son[i]->index=i;
  518.                          y->k[i]=y->k[i+1];
  519.                          y->same[i]=y->same[i+1];
  520.                        };
  521.                        y->p--;     // decrease number of children
  522.                        y->son[y->p]=y->son[y->p+1];
  523.                        y->son[y->p]->index=y->p;
  524.                        y->son[y->p+1]=0;  
  525.                        y->k[y->p]=0;
  526.        y->same[y->p] = 0;                 
  527.                      }
  528.      else            {    // y is at the left side of v
  529.                        for(int i=v->p;i>=1;i--) 
  530.                        { v->son[i+1]=v->son[i];
  531.                          v->son[i+1]->index=i+1;
  532.                          v->k[i+1]=v->k[i];
  533.                          v->same[i+1]=v->same[i]; 
  534.                         };
  535.                        v->son[1]=y->son[y->p];
  536.                        v->son[1]->index=1;
  537.                        v->son[1]->father=v;
  538.                        y->son[y->p]=0;
  539.                        v->p++;
  540.                        y->p--;
  541.                        v->k[1]=z->k[y->index];
  542.        v->same[1]=z->same[y->index];     
  543.        v->same[1]->same[1] = v;            
  544.                        z->k[y->index]=y->k[y->p];
  545.                        z->same[y->index]=y->same[y->p];  
  546.                        z->same[y->index]->same[1] = z;   
  547.                        y->k[y->p]=0;
  548.        y->same[y->p]=0;                    
  549.                      };
  550.      }
  551.  void ab_tree::del_item(ab_tree_node* w)
  552.     {
  553.          /* 
  554.           we must delete leave w with father v
  555.           we shrink v by deleting leave w and one of the keys in the 
  556.           adjacent to the pointer to w 
  557.           (if w is the i-th son of v then we delete k[i](v) if i<v->p
  558.           k[i-1](v) if i=v->p  ).
  559.   m.w. if i=v->p we overwrite the inner node 
  560.        in which key w->k[1] is stored with k[i-1](v)
  561.        and then delete k[i-1](v)
  562.          */
  563.        if (w==nil) error_handler(1,"ab_tree: nil item in del_item");
  564.        count--;
  565.        if (maximum==minimum)  
  566.         { maximum=minimum=root=0; 
  567.           height=-1; 
  568.           clear_key(w->k[1]);
  569.           clear_inf(w->inf);
  570.           delete w; 
  571.           return;
  572.          }
  573. /* here w==root==> last leave will be deleted*/
  574.        
  575.        ab_tree_node* succ = w->son[2];
  576.        ab_tree_node* pred = w->son[1];
  577.        if (pred) pred->son[2]   = succ;
  578.        else minimum = succ;
  579.        if (succ) succ->son[1] = pred;
  580.        else  maximum = pred;
  581.        ab_tree_node* v    = w->father;
  582.        v->son[w->index]=0;
  583.        if (w->index==v->p) {
  584.      if (succ)
  585.      { //overwrite copies in inner node u
  586.        ab_tree_node* u = w->same[1];
  587.        int pos=1;
  588.                                while(u->same[pos]!=w) pos++;
  589.        u->k[pos]=pred->k[1];  
  590.        u->same[pos]=pred;
  591.        pred->same[1] = u;
  592.      }
  593.      else
  594.        v->same[v->p-1]->same[1]=0; 
  595.                              v->k[v->p-1]=0;
  596.      v->same[v->p-1]=0;           
  597.    }
  598.        else                { v->k[w->index]=0 ;
  599.      v->same[w->index]=0;         
  600.                              for(int i=w->index;i<(v->p)-1;i++)
  601.                              { v->k[i]=v->k[i+1];
  602.                                v->same[i]=v->same[i+1]; 
  603.                                v->son[i]=v->son[i+1];
  604.                                v->son[i]->father=v;
  605.                                v->son[i]->index=i;
  606.                               };
  607.                              v->son[v->p-1]=v->son[v->p];
  608.                              v->son[v->p]=0;
  609.                              v->k[v->p-1]=0;
  610.                              v->same[v->p-1]=0;          
  611.                              v->son[v->p-1]->father=v;
  612.                              v->son[v->p-1]->index=v->p-1;
  613.                            };
  614.        clear_key(w->k[1]);
  615.        clear_inf(w->inf);
  616.        delete w;
  617.        (v->p)--;
  618.        
  619.        if ((v==root) && (v->p==1)) {  
  620.                                   if (v->son[1]==0) 
  621.                                       {v->son[1]=v->son[2];
  622.                                        v->son[2]=0;  };
  623.                                   root=v->son[1];
  624.                                   delete v;
  625.                                   root->index=0;
  626.                                   root->father=0;
  627.                                   root->p=0;
  628.                                   root->height=0;
  629.                                   height=0;
  630.                                   minimum=maximum=root;
  631.                                   return; 
  632.                                 };
  633.        if (v->p >= a) return;
  634.     /* otherwise v needs to be rebalanced by either fusing or sharing
  635.      let y be any brother of v*/
  636.      ab_tree_node* z;
  637.      ab_tree_node* y;
  638.      int dir;
  639.        if (v->index==1)  {
  640.                             z=v->father;
  641.                             y=z->son[v->index+1] ;
  642.                            dir=1;    //  y is the right son of v
  643.                          }
  644.        else              { 
  645.                             z=v->father;
  646.                             y=z->son[v->index-1] ;
  647.                            dir =0;   //  y is the left son of v
  648.                          };
  649.        while ((v->p==a-1) && (y->p==a))
  650.             {
  651.              if (dir==1) fuse(v,y); 
  652.              else  fuse(y,v); 
  653.              if (z==root) {
  654.                            if (z->p==1) {
  655.                                          if (dir==1){
  656.                                                       root=v;
  657.                                                       v->father=0;
  658.                                                       v->index=0;   }
  659.                                          else {
  660.                                                 root=y;
  661.                                                 y->father=0;
  662.                                                 y->index=0;    };
  663.                                          height--;
  664.                                          delete z;  
  665.                                        };
  666.                            return;
  667.                           };
  668.              v=z;       // continue recursion
  669.              if (v->index==1)  {z=v->father;
  670.                                 y=z->son[v->index+1] ;
  671.                                 dir=1;  // y is the right son of v
  672.                                }
  673.              else              { z=v->father;
  674.                                  y=z->son[v->index-1];
  675.                                  dir=0;
  676.                                };
  677.             };
  678.     /* we have either v->p>=a and rebalancing is completed or
  679.      v->p = a-1 and y->p > a and rebalancing is completed by sharing;*/
  680.       if (v->p==a-1)
  681.         {       /*
  682.                  it is important to which side y is in order to v
  683.                  ==> dir is an information about in the function share
  684.                 */
  685.            share(v,y,dir);
  686.         };
  687.       return;
  688.  }
  689. ab_tree& ab_tree::conc(ab_tree& s2)
  690.   if ((a!=s2.a)||(b!=s2.b)) 
  691.      error_handler(1,"ab_tree: incompatible trees in concatenate operation");
  692.   if (s2.root==0) return *this;
  693.   if (root==0) 
  694.   { root=s2.root;
  695.     maximum=s2.maximum;
  696.     minimum=s2.minimum;
  697.     height=s2.height;
  698.     count =s2.count;
  699.    }
  700.   else
  701.   { if (cmp(maximum->k[1],s2.minimum->k[1])>=0) 
  702.                     error_handler(1,"ab_tree: join(S,T) : max(S)>=min(T)"); 
  703.     concat(*this,s2,maximum,maximum->k[1]);
  704.     // link leaves 
  705.     maximum->son[2]=s2.minimum;       
  706.     s2.minimum->son[1]=maximum;
  707.     maximum=s2.maximum;              
  708.    }
  709.   s2.root=0;
  710.   s2.maximum=0;
  711.   s2.minimum=0;
  712.   s2.height=-1;
  713.   return *this;
  714. }
  715. /*---------------------------------------------------------------------
  716.   global functions
  717. ----------------------------------------------------------------------*/
  718. void concat(ab_tree& s1,ab_tree& s2,ab_tree_node* current,GenPtr cur_key)
  719.   // Result in s1
  720.   ab_tree_node* v=s1.root;
  721.   ab_tree_node* w=s2.root;
  722.   int h1=v->height;     
  723.   int h2=w->height;
  724.   int i;
  725.   if(h1==h2)
  726.      { ab_tree_node* z=new ab_tree_node(2,h1+1,0,0,s1.b);
  727.        z->son[1]=v;z->son[2]=w; z->k[1]=cur_key;
  728.        z->son[1]->father=z; z->son[2]->father=z;
  729.        z->son[1]->index=1;z->son[2]->index=2;
  730.        z->same[1]=current;              
  731.        current->same[1]=z;              
  732.        s1.height++;
  733.        s1.root=z;
  734.     }
  735.   else { if (h1>h2)
  736.          {
  737.             for(i=1;i<h1-h2;i++,v=v->son[v->p]);  
  738.             v->son[v->p+1]=w;
  739.             v->son[v->p+1]->father=v;
  740.             v->son[v->p+1]->index=v->p+1;
  741.             v->k[v->p]=cur_key;
  742.     v->same[v->p]=current;     
  743.     current->same[1]=v;        
  744.       v->p++;
  745.     if (v->p==s1.b+1)  {s1.split_node(v);  };
  746.         }
  747.         else /* h1<h2 */
  748.         {
  749.    for(i=1;i<=h2-h1-1;i++,w=w->son[1]);
  750.            for(i=w->p;i>1;i--)
  751.             { w->son[i+1]=w->son[i];
  752.               w->son[i+1]->father=w;
  753.          w->son[i+1]->index=i+1;
  754.               w->k[i]=w->k[i-1];
  755.       w->same[i]=w->same[i-1];   
  756.             };
  757.            w->p++;
  758.            w->son[2]=w->son[1];
  759.            w->son[2]->father=w;
  760.            w->son[2]->index=2;
  761.            w->son[1]=v;
  762.            w->son[1]->father=w;
  763.            w->son[1]->index=1;
  764.            w->k[1]=cur_key;
  765.    w->same[1]=current;             
  766.    current->same[1]=w;             
  767.            if (w->p==s2.b+1) {s2.split_node(w);};
  768.    s1.root =  s2.root;
  769.    s1.height =  s2.height;
  770.         }
  771.       }
  772.   /* maximum/minimum are now undefined  */
  773. }
  774. /*
  775. void ab_tree::split_at_key(GenPtr y,ab_tree& L,ab_tree& R)
  776. { ab_tree_node* w = locate(y);
  777.   if (!w) error_handler(1,"ab_tree: split: no item ");
  778.   split_at_item(w,L,R);
  779.  }
  780. */
  781. void ab_tree::split_at_item(ab_tree_node* w,ab_tree& L,ab_tree& R)
  782.   {
  783.     if(((a!=L.a)||(a!=R.a))||((b!=L.b)||(b!=R.b)))
  784.        error_handler(1,"ab_tree: incompatible trees in split operation");
  785.     
  786.     /* initialisation   */
  787.     L.root=L.minimum=L.maximum=0;L.height=-1;
  788.     R.root=R.minimum=R.maximum=0;R.height=-1;
  789.     if(root==0) return;
  790.     if (w==0) 
  791.     { R.root = root;
  792.       R.height = height;
  793.       R.maximum = maximum;
  794.       R.minimum = minimum;
  795.       R.count = count;
  796.       root = 0;
  797.       height = -1;
  798.       maximum = 0;
  799.       minimum = 0;
  800.       count = 0;
  801.       return;
  802.      }
  803.     if (w==maximum) 
  804.     { L.root = root;
  805.       L.height = height;
  806.       L.maximum = maximum;
  807.       L.minimum = minimum;
  808.       L.count = count;
  809.       root = 0;
  810.       height = -1;
  811.       maximum = 0;
  812.       minimum = 0;
  813.       count = 0;
  814.       return;
  815.      }
  816.     ab_tree_node* l;
  817.     ab_tree_node* r;    // pointers to the roots of the left and right subtree
  818.     /* parameters for concat  */
  819.     ab_tree_node* current_l=0 ;
  820.     GenPtr           current_l_key=0;
  821.     ab_tree_node* current_r=0;  
  822.     GenPtr           current_r_key=0;
  823.     int i;
  824.     /* w is a pointer to the leave y  */
  825.     ab_tree_node* v;
  826.     /* store leaf to split at         */
  827.     ab_tree_node* leaf=w;
  828.      l = w;
  829.      r = 0;
  830.       do{
  831.          v=w->father;
  832.          int index_of_w = w->index; 
  833.        /* now we have construct the  left and right subtrees and the pointers
  834.           to the roots  --> we must construct two trees with these roots*/
  835.         if ((L.root==0)&&(l!=0))  { L.root=l;
  836.             L.height=l->height; 
  837.             L.root->father=0;
  838.             L.root->index=0;
  839.           }
  840.         else { if ((L.root!=0)&&(l!=0))
  841.                  {  ab_tree L1(L.a,L.b);
  842.             L1.root=l;
  843.                     L1.height=l->height;
  844.                     L1.root->father=0;
  845.                     L1.root->index=0;
  846.             concat(L1,L,current_l,current_l_key);
  847.             L.root  = L1.root;
  848.                     L.height= L1.height;
  849.                     L.count = L1.count;
  850.                     L1.root=0;
  851.          }
  852.              }
  853.        if ((R.root==0)&&(r!=0))  {R.root=r;
  854.            R.height=r->height;
  855.           R.root->father=0;
  856.           R.root->index=0;
  857.                                   R.root->p=r->p;
  858.          }
  859.        else { if ((R.root!=0)&&(r!=0))
  860.                 { ab_tree R1(R.a,R.b);
  861.      R1.root=r;
  862.   R1.height=r->height;
  863.                   R1.root->father=0;
  864.                   R1.root->index=0;
  865.                   R1.root->p=r->p;
  866.   concat(R,R1,current_r,current_r_key);
  867.                   R1.root=0;
  868.         }
  869.             }
  870.         if (v!=0)
  871.         {
  872.          if (index_of_w==1)     /* w is leftmost son of v */
  873.          { l=0;
  874.            r=v;
  875.            current_r=v->same[1];
  876.            current_r_key=v->k[1];
  877.    r->same[1]->same[1]=0;        
  878.    for(i=2;i<r->p;i++) 
  879.             {  r->son[i-1]=r->son[i];
  880.            r->son[i-1]->index=i-1;
  881.          r->k[i-1]=r->k[i];
  882.        r->same[i-1]=r->same[i];  
  883.          }
  884.            r->son[r->p-1]=r->son[r->p];    /* last son */
  885.            r->son[r->p-1]->index=r->p-1;
  886.            r->son[r->p]=0;
  887.            r->p--; 
  888.            r->k[r->p]=0;
  889.    r->same[r->p]=0;      
  890.            if (r->p==1) r=r->son[1];
  891.          } 
  892.          else {if ( index_of_w==v->p )
  893.                  {  r=0;
  894.                     l=v;
  895.     l->son[l->p]=0;  /* last son */
  896.     l->p--;
  897.     current_l=l->same[index_of_w-1];
  898.     current_l_key=current_l->k[1];
  899.                     l->k[l->p]=0;
  900.     l->same[l->p]->same[1]=0;   
  901.     l->same[l->p]=0;            
  902.                     if (l->p==1) l=l->son[1];
  903.                else  /* if w is not the leftmost or rightmost son of v*/
  904.                {  
  905.                  r=v;
  906.                  l=new ab_tree_node(index_of_w-1,v->height,0,0,R.b);
  907.    current_l=v->same[index_of_w-1];
  908.    current_l_key=current_l->k[1];
  909.  current_r=v->same[index_of_w];   
  910.  current_r_key=current_r->k[1];
  911.  // current_r=(v->k[index_of_w])-1;   ERROR: liefert neuen Schluessel ;
  912.                  for(i=1;i<index_of_w-1;i++)
  913.       {
  914.    l->son[i]=v->son[i];
  915.    l->son[i]->index=i;
  916.                    l->son[i]->father=l;
  917.    l->k[i]=v->k[i];
  918.    l->same[i]=v->same[i];  
  919.    l->same[i]->same[1]=l;  
  920.   };
  921.  l->son[index_of_w-1]=v->son[index_of_w-1];
  922.  l->son[index_of_w-1]->index=index_of_w-1;
  923.                  l->son[index_of_w-1]->father=l;
  924.                  r->son[index_of_w] = 0;   // changed
  925.       for (i=1;i<r->p-index_of_w;i++)
  926.   {
  927.    r->son[i]=r->son[i+index_of_w];
  928.                    r->son[i+index_of_w]=0;
  929.                  r->son[i]->index=i;
  930.                    r->son[i]->father=r;
  931.    r->k[i]=r->k[i+index_of_w];
  932.    r->same[i]=r->same[i+index_of_w]; 
  933.                    r->k[i+index_of_w]=0;
  934.    r->same[i+index_of_w]=0;
  935.   };
  936.          r->son[r->p-index_of_w]=r->son[r->p];  /* last son */
  937.                  r->son[r->p]=0;
  938.  r->son[r->p-index_of_w]->index=i;
  939.                  r->son[r->p-index_of_w]->father=r;
  940.  r->p=r->p-index_of_w;
  941.                  if (l->p==1) l=l->son[1];
  942.                  if (r->p==1) r=r->son[1];
  943.                 };
  944.                };
  945.               };
  946.  /* initialisation for the next iteration  */
  947.   w=v;
  948.  }
  949.  while (w!=0);
  950.  /* unlink leaves    m.w.         */
  951.  leaf->same[1]=0;
  952.  leaf->son[2]->son[1]=0;
  953.  leaf->son[2]=0;
  954.  /* redefine maximum and minimum  */
  955.  L.minimum=minimum;
  956.  ab_tree_node* help=L.root;
  957.  while (help->p) help=help->son[help->p];
  958.  L.maximum=help;
  959.  help=R.root;
  960.  while (help->son[1]!=0) help=help->son[1];
  961.  R.minimum=help;
  962.  R.maximum=maximum;
  963.  maximum=minimum=root=l=r=0;
  964.  height=-1; 
  965.  count = 0;
  966.  delete l;
  967.  delete r;
  968. }
  969. void ab_tree::pr_ab_tree(ab_tree_node* localroot,int blancs) const
  970.   if (localroot==0)
  971.    { for(int j=1;j<=blancs;j++) cout<<" ";
  972.      cout << "NILn";
  973.      return;
  974.     }
  975.   
  976.   if (localroot->p == 0) 
  977.    { for(int j=1;j<=blancs;j++) cout<<" ";
  978.      print_key(localroot->k[1]); 
  979. /*
  980.      ab_tree_node* s= localroot->same[1];
  981.      cout << " same = "; 
  982.      if (s) print_key(s->k[1]); 
  983.      else cout << "NIL";
  984. */
  985.      cout << "n";
  986.     }
  987.    else
  988.     { for(int i=1;i<localroot->p;i++)
  989.       { pr_ab_tree(localroot->son[i],blancs+10);
  990.         for(int j=1;j<=blancs;j++) cout<<" ";
  991.         print_key(localroot->k[i]); 
  992. /*
  993.         cout << " same = "; 
  994.         print_key(localroot->same[i]->k[1]); 
  995. */
  996.         cout << "n";
  997.        };
  998.       pr_ab_tree(localroot->son[localroot->p],blancs+10);
  999.     }
  1000.  
  1001. ab_tree_node* ab_tree::copy_ab_tree(ab_tree_node* localroot,
  1002.                                     abnode& last_leaf,int b0) const
  1003.   ab_tree_node* r;
  1004.   if (localroot->p == 0)   //leaf
  1005.    { r=new ab_tree_node(localroot->p,localroot->height,localroot->index,0,1); 
  1006.      r->k[1]= localroot->k[1];
  1007.      r->inf = localroot->inf;
  1008.      copy_key(r->k[1]);
  1009.      copy_inf(localroot->inf);
  1010.      r->son[1]=last_leaf;
  1011.      if (last_leaf) last_leaf->son[2] = r;
  1012.      last_leaf = r;               
  1013.     }
  1014.   else
  1015.    { r=new ab_tree_node(localroot->p,localroot->height,localroot->index,0,b0); 
  1016.      for(int i=1;i<localroot->p;i++)
  1017.      { r->son[i]=copy_ab_tree(localroot->son[i],last_leaf,b0);
  1018.        r->son[i]->father=r;
  1019.        r->k[i]=localroot->k[i];
  1020.        last_leaf->same[1]=r;        
  1021.        r->same[i]=last_leaf;        
  1022.       }
  1023.      r->son[localroot->p]=copy_ab_tree(localroot->son[localroot->p],last_leaf,b0);
  1024.      r->son[localroot->p]->father=r;
  1025.    }
  1026.   return r;
  1027. }
  1028.         
  1029. void ab_tree::del_tree(ab_tree_node* localroot)
  1030. { // deletes subtree  rooted at localroot
  1031.   int k = localroot->p;
  1032.   for(int i=1;i<=k;i++) del_tree(localroot->son[i]);
  1033.   if (k==0) //leaf
  1034.   { clear_key(localroot->k[1]);
  1035.     clear_inf(localroot->inf);
  1036.    }
  1037.   delete localroot;
  1038. }
  1039. void ab_tree::change_inf(ab_tree_node* p, GenPtr x) 
  1040. { clear_inf(p->inf);
  1041.   copy_inf(x);
  1042.   p->inf = x;
  1043.  }