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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  bb1_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_BB_TREE_H
  12. #define LEDA_BB_TREE_H
  13. //--------------------------------------------------------------------
  14. //  
  15. //  BB[alpha] Trees
  16. //
  17. //  Michael Wenzel   (1989)
  18. //
  19. // Implementation follows
  20. // Kurt Mehlhorn: Data Structures and Algorithms 1, section III.5.1
  21. //
  22. // Aenderungen:
  23. //   - virtuelle compare-Funktion   (M. Wenzel, Nov. 1989)
  24. //--------------------------------------------------------------------
  25. #include <LEDA/b_stack.h>
  26. // -----------------------------------------------------
  27. // declarations and definitions
  28. // -------------------------------------------------------
  29. const int BSTACKSIZE = 32 ; // according to tree.size and alpha
  30. const float SQRT1_2 = 0.70710678;
  31. class bb1_node;
  32. class bb1_tree;
  33. typedef bb1_node* bb1_item;
  34. typedef bb1_node* bb1_tree_item;
  35. typedef b_stack<bb1_item> bb1_tree_stack;
  36. typedef void (*DRAW_BB_NODE_FCT)(double,double,void*);
  37. typedef void (*DRAW_BB_EDGE_FCT)(double,double,double,double);
  38. class bb1_node {
  39.   GenPtr ke;
  40.   GenPtr inf;
  41.   int gr;
  42.   bb1_item sohn[2];
  43.   friend class bb1_tree;
  44.   friend class range_tree;
  45.   friend class Segment_Tree;
  46.   friend class seg_node_tree;
  47. public:
  48.   GenPtr key()           { return ke; }
  49.   GenPtr info()          { return inf; }
  50.   int blatt()         { return (gr==1); }
  51.   int groesse()       { return gr; }
  52.   float bal()
  53. { if (blatt()) return 0.5 ;
  54.   else return float(float(sohn[0]->groesse())/float(gr));
  55.         }
  56.   bb1_node(GenPtr k=0,GenPtr i=0,int leaf=0,bb1_item ls=0,bb1_item rs=0)
  57.     { ke = k;
  58.       inf = i;
  59.       sohn[0] = ls;
  60.       sohn[1] = rs;
  61.       if (leaf==0)
  62. gr=1;
  63.       else gr = ls->groesse()+rs->groesse();
  64.     }
  65.   bb1_node(bb1_item p)
  66.     { 
  67.       ke = p->key();
  68.       inf = p->info();
  69.       gr = p->groesse();
  70.       sohn[0] = p->sohn[0];
  71.       sohn[1] = p->sohn[1];
  72.     }
  73.       
  74.   LEDA_MEMORY(bb1_node)
  75. }; 
  76. class bb1_tree {
  77.   bb1_item root;
  78.   bb1_item first;
  79.   bb1_item iterator;
  80.   int   anzahl; 
  81.   float alpha;
  82.   float d;
  83.   bb1_tree_stack st;
  84.   friend class bb1_node;
  85.   friend class range_tree;
  86.   friend class seg_node_tree;
  87.   friend class Segment_Tree;
  88.   int   blatt(bb1_item it)
  89. { return (it) ? it->blatt() : 0; }
  90.   void  lrot(bb1_item , bb1_item ); 
  91.   void  rrot(bb1_item , bb1_item ); 
  92.   void  ldrot(bb1_item , bb1_item ); 
  93.   void  rdrot(bb1_item , bb1_item ); 
  94.   void  deltree(bb1_item);
  95.   bb1_item copytree(bb1_item , bb1_item , bb1_item& );
  96.   bb1_item search(GenPtr);
  97.   bb1_item sinsert(GenPtr, GenPtr=0);
  98.   bb1_item sdel(GenPtr );
  99. protected:
  100.  bb1_tree_item item(void* p) const { return bb1_tree_item(p); }
  101. public:
  102.   virtual int cmp(GenPtr, GenPtr) 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.   GenPtr     key(bb1_item it)  const   { return it->ke;  }
  108.   GenPtr&    info(bb1_item it)         { return it->inf; }
  109.   GenPtr     inf(bb1_item it)  const   { return it->inf; }
  110.   GenPtr     translate(GenPtr y);
  111.   bb1_item insert(GenPtr ,GenPtr );
  112.   bb1_item change_obj(GenPtr ,GenPtr );
  113.   bb1_item change_inf(bb1_item it,GenPtr y) { if (it)  
  114.                                     { it->inf = y;
  115.                                            return it; }
  116.                                          else return 0;
  117.                                         }
  118.   bb1_item del(GenPtr);
  119.   void del_item(bb1_item it) { if (it) del(it->key()); }
  120.   void del_min() { if (first) del(first->key()); } 
  121.   void decrease_key(bb1_item p, GenPtr k) { GenPtr i = p->info(); 
  122.                                             del(p->key());
  123.                                             insert(k,i);
  124.                                            }
  125.   bb1_item locate(GenPtr)  const;
  126.   bb1_item located(GenPtr) const;
  127.   bb1_item lookup(GenPtr)  const;
  128.   bb1_item cyclic_succ(bb1_item it)  const
  129.      { return it ? it->sohn[1] : 0 ; }
  130.   bb1_item cyclic_pred(bb1_item it)  const
  131.   { return it ? it->sohn[0] : 0 ; }
  132.   bb1_item succ(bb1_item it) const
  133.           { return ( it && it->sohn[1] != first ) ? it->sohn[1] : 0 ; }
  134.   bb1_item pred(bb1_item it) const
  135.           { return ( it && it != first ) ? it->sohn[0] : 0 ; }
  136.   bb1_item ord(int k);
  137.   bb1_item min()       const    { return (first) ? first : 0; }
  138.   bb1_item find_min()  const    { return (first) ? first : 0; }
  139.   bb1_item max()       const    { return (first) ? first->sohn[0] : 0 ; }
  140.   bb1_item first_item() const         { return (first) ? first : 0; }
  141.   bb1_item next_item(bb1_item x) const { return succ(x); }
  142.   bb1_item move_iterator() ;
  143.   int current_item(bb1_item& x) 
  144.      { if (!iterator) return 0;
  145.        else { x = iterator; return 1; }
  146.      }
  147.   void init_iterator()          { iterator = 0; }
  148.   void  lbreak()                { iterator = 0; }
  149.   void  clear();
  150.   int   size()    const        { return anzahl; }
  151.   int   empty()   const        { return (anzahl==0) ? true : false; }
  152.   int   member(GenPtr );
  153.   bb1_tree& operator=(const bb1_tree& w);
  154.   void  set_alpha(float a) 
  155.         { if (anzahl>=3)
  156.              error_handler(4,"aenderung von alpha nicht erlaubt");
  157.           if ((a<0.25) || (a>1-SQRT1_2))
  158.              error_handler(3,"alpha not in range");
  159.           alpha=a;
  160.           d = 1/(2-alpha) ;
  161.         }
  162.   float get_alpha() { return alpha; }
  163.   bb1_tree() : st(BSTACKSIZE)
  164.   { 
  165.     root = first = iterator = 0;
  166.     anzahl = 0;
  167.     alpha=0.28;
  168.     d=1/(2-alpha);
  169.   }
  170.   bb1_tree(float);
  171.   bb1_tree(const bb1_tree&);
  172. // virtual  // if the destructor is declared virtual range/segment trees crash
  173.   ~bb1_tree()  { clear(); }
  174.   void draw(DRAW_BB_NODE_FCT, DRAW_BB_EDGE_FCT, bb1_node*,
  175.             double, double, double, double, double);
  176.   void draw(DRAW_BB_NODE_FCT, DRAW_BB_EDGE_FCT, 
  177.             double, double, double, double);
  178. };
  179. #endif