ab_tree.h
Upload User: gzelex
Upload Date: 2007-01-07
Package Size: 707k
Code Size: 6k
Development Platform:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  ab_tree.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_AB_TREE_H
  12. #define LEDA_AB_TREE_H
  13. //------------------------------------------------------------------------------
  14. //
  15. // (a,b)-trees 
  16. //
  17. // Evelyn Haak, Juergen Dedorath, and Dirk Basenach   (1989)
  18. //
  19. // Implementation follows
  20. // Kurt Mehlhorn : "Data Structures and Algorithms 1", section III, 5.2 - 5.3
  21. //
  22. // Modifications:
  23. // -------------
  24. //
  25. // - member-function insert_at_item added  ( Michael Wenzel , Nov. 89)
  26. //
  27. // - virtual compare function ( Michael Wenzel , Nov. 89)
  28. //
  29. // - delete : overwrite copies of inner nodes by
  30. //            following links between different
  31. //            instances of the same key    ( Michael Wenzel , Jan. 90)
  32. //
  33. // - virtual clear functions  ( S. Naeher, Mai 90)
  34. //
  35. //------------------------------------------------------------------------------
  36. #include    <LEDA/basic.h>
  37. //------------------------------------------------------------------------------
  38. //  some declarations
  39. //------------------------------------------------------------------------------
  40. class ab_tree;
  41. class ab_tree_node;
  42. typedef ab_tree_node* abnode;
  43. typedef ab_tree_node* ab_tree_item;
  44. /*------------------------------------------------------------*/
  45. /*  class ab_tree_node                                        */
  46. /*------------------------------------------------------------*/
  47. class ab_tree_node {
  48.   friend class ab_tree;
  49.   friend void concat(ab_tree& s1,ab_tree& s2,ab_tree_node* current,GenPtr cur_key);
  50.   friend void pr_ab_tree(ab_tree_node* localroot,int blancs);
  51.   friend void del_ab_tree(ab_tree_node* localroot);
  52.  
  53.   int p;           /* number of sons,a<=p<=b,0 iff leave*/
  54.   int height;      /* height of node*/
  55.   int index;       /* v is index'th son of his father*/
  56.   ab_tree_node* father;   
  57.   GenPtr* k;    /* array[1..b] --------------------------  */
  58.                          //-----------------------------------
  59.                          /*to every node v of T we assign p(v)-1 */
  60.                          /*elements k[1](v),...,k[p(v)-1](v) of U*/
  61.                          /* such that for all i (1<i<p(v)-1):*/
  62.                          /* k[i](v) < k[i+1](v) and for all leaves*/
  63.                          /* w in the i-th subtree of v we have*/
  64.                          /* k[i-1] < key[w] <= k[i](v) */
  65.                          /*------------------------------------*/
  66.                          /* if v is a leave ==> k[1]=key[v]*/
  67.                          
  68.   ab_tree_node** son;    /* array [1..b+1] of pointer to sons*/
  69.   ab_tree_node** same;   /* m.w. : links between same keys */
  70.                          /* array [1..b]                   */
  71.   GenPtr inf;
  72. /* size = 8 words  */
  73. public:
  74.   ab_tree_node(int p,int height,int index,ab_tree_node* father,int b);
  75.  ~ab_tree_node();
  76.   LEDA_MEMORY(ab_tree_node)
  77.  }; 
  78.   
  79. /*-----------------------------------------------------------------*/
  80. class ab_tree   
  81.    {
  82.     friend class ab_tree_node;
  83.     friend void concat(ab_tree&,ab_tree&,ab_tree_node*,GenPtr); 
  84.     friend void pr_ab_tree(ab_tree_node* localroot,int blancs);
  85.     friend void del_ab_tree(ab_tree_node* localroot);
  86.     int a;
  87.     int b;
  88.     int height;             /* height of tree   */
  89.     int count;              /* number of leaves */
  90.     ab_tree_node* root;
  91.     ab_tree_node* minimum;  
  92.     ab_tree_node* maximum;
  93.     ab_tree_node* expand(ab_tree_node* v,int i);
  94.     void split_node(ab_tree_node* v);
  95.     void share(ab_tree_node* v,ab_tree_node* y,int direct);
  96.     void fuse (ab_tree_node* v,ab_tree_node* w);
  97.     void del_tree(ab_tree_node* localroot);
  98.     void exchange_leaves(ab_tree_node*, ab_tree_node*);
  99.     void pr_ab_tree(ab_tree_node*,int) const;
  100.     ab_tree_node* copy_ab_tree(ab_tree_node*,abnode&,int) const;
  101.     virtual int cmp(GenPtr, GenPtr) const { return 0; }
  102.     virtual int int_type() const { return 0; }
  103.     virtual void clear_key(GenPtr&) const {}
  104.     virtual void clear_inf(GenPtr&) const {}
  105.     virtual void copy_key(GenPtr&)  const {}
  106.     virtual void copy_inf(GenPtr&)  const {}
  107.     virtual void print_key(GenPtr)  const {}
  108.     virtual void print_inf(GenPtr)  const {}
  109. protected:
  110.  ab_tree_item item(void* p) const { return ab_tree_item(p); }
  111. public:
  112.     void clear();
  113.     GenPtr  inf(ab_tree_node* p)  const { return p->inf; }
  114.     GenPtr  key(ab_tree_node* p)  const { return p->k[1]; }
  115.     ab_tree_node* insert(GenPtr, GenPtr);
  116.     ab_tree_node* insert_at_item(ab_tree_node*, GenPtr, GenPtr);
  117.     ab_tree_node* locate(GenPtr) const;
  118.     ab_tree_node* locate_succ(GenPtr) const;
  119.     ab_tree_node* locate_pred(GenPtr) const;
  120.     ab_tree_node* lookup(GenPtr) const;
  121.     void del(GenPtr);
  122.     void del_item(ab_tree_node*);
  123.     void change_inf(ab_tree_node*, GenPtr);
  124.     void reverse_items(ab_tree_node*, ab_tree_node*);
  125.     ab_tree& conc(ab_tree&);
  126.     void split_at_item(ab_tree_node* w,ab_tree& L,ab_tree& R);
  127.     void del_min()                 { if (minimum) del_item(minimum); }
  128.     void decrease_key(ab_tree_node* p, GenPtr k) { GenPtr i = p->inf;
  129.                                                 copy_key(i);
  130.                                                 del_item(p);
  131.                                                 insert(k,i);
  132.                                                 clear_key(i);
  133.                                                }
  134.     bool member(GenPtr k)  const { return (lookup(k))? true: false ; }
  135.     ab_tree_node* min()                      const { return minimum; }
  136.     ab_tree_node* find_min()                 const { return minimum; }
  137.     ab_tree_node* max()                      const { return maximum; }
  138.     ab_tree_node* first_item()               const { return minimum; }
  139.     ab_tree_node* next_item(ab_tree_node* p) const { return p->son[2]; }
  140.     ab_tree_node* succ(ab_tree_node* p)      const { return p->son[2]; }
  141.     ab_tree_node* pred(ab_tree_node* p)      const { return p->son[1]; }
  142.     int  size()  const { return count;       }
  143.     bool empty() const { return (count==0) ? true : false;   }
  144.     void print() const { pr_ab_tree(root,1); }
  145.     //ab_tree(int a_=2,int b_=4); 
  146.     ab_tree(int=2,int=16); 
  147.     ab_tree(const ab_tree& T);
  148.     ab_tree& operator=(const ab_tree&);
  149.  
  150.     virtual ~ab_tree(){ clear(); }
  151.  };
  152. #endif