home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ledar34.zip / leda-r-3_4_tar / LEDA-3.4 / src / dict / _ab_tree.c next >
C/C++ Source or Header  |  1996-09-03  |  34KB  |  1,290 lines

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