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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  bin_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_BIN_TREE_H
  12. #define LEDA_BIN_TREE_H
  13. //------------------------------------------------------------------------------
  14. //
  15. // bin_tree  
  16. //
  17. //     base class for all leaf oriented binary trees in LEDA
  18. //
  19. // Stefan N"aher (1993)
  20. //
  21. //------------------------------------------------------------------------------
  22. #include <LEDA/basic.h>
  23.  
  24. class bin_tree;
  25. class bin_tree_node;
  26. typedef bin_tree_node* bin_tree_item;
  27. typedef void (*DRAW_BIN_NODE_FCT)(double,double,void*,int);
  28. typedef void (*DRAW_BIN_EDGE_FCT)(double,double,double,double);
  29. //------------------------------------------------------------------------------
  30. // class bin_tree_node 
  31. //------------------------------------------------------------------------------
  32. class bin_tree_node
  33. {  
  34.    friend class bin_tree;
  35.    friend class avl_tree;
  36.    friend class bb_tree;
  37.    friend class rb_tree;
  38.    friend class rs_tree;
  39.    GenPtr   k;              // key
  40.    GenPtr   i;              // info
  41.    bin_tree_node* child[2]; // node: left and right child
  42.                             // leaf: successor and predecessor
  43.    bin_tree_node* parent;   // pointer to parent
  44.    bin_tree_node* corr;     // leaf: pointer to corresponding inner node
  45.                             // node: nil
  46.    int   bal;               // rebalancing data
  47.  
  48. /*
  49.    public:
  50. */
  51.    bin_tree_node(GenPtr key, GenPtr inf, int b)
  52.    { k = key;
  53.      i = inf; 
  54.      bal = b;
  55.     }         
  56.    bin_tree_node() { }         
  57.    bin_tree_node(bin_tree_node* p)
  58.    { k = p->k;
  59.      i = p->i ;
  60.      bal = p->bal;
  61.     }         
  62.    bool is_node()   { return (corr == nil);  }
  63.    bool is_leaf()   { return (corr != nil); }
  64.    void set_bal(int x) { bal = x; }
  65.    int  get_bal()      { return bal; }
  66.    LEDA_MEMORY(bin_tree_node)
  67. };
  68.  
  69. //------------------------------------------------------------------------------
  70. // class bin_tree
  71. //------------------------------------------------------------------------------
  72. class bin_tree
  73.   protected:
  74.   enum { left=0, right=1 };
  75.   bin_tree_node ROOT;       // "super root" to avoid special cases in rotations
  76.                             // ROOT.child[left] points to real root node
  77.                             // ROOT.child[right] points to leftmost leaf
  78.   int count;            
  79.   // functions depending on used rebalancing method
  80.   // will be defined in derived classes (rb_tree, avl_tree, ...)
  81.   virtual int leaf_balance() { return 0; }  // default balance value for leaves
  82.   virtual int node_balance() { return 0; }  // inner nodes
  83.   virtual int root_balance() { return 0; }  // root node
  84.   virtual void insert_rebal(bin_tree_node*)   {}
  85.   virtual void del_rebal(bin_tree_node*, bin_tree_node*) {}
  86.   // other protected member functions
  87.   bin_tree_node*& min_ptr() const 
  88.                            { return (bin_tree_node*&)ROOT.child[right];}
  89.   void rotation(bin_tree_node*, bin_tree_node*, int);
  90.   void double_rotation(bin_tree_node*, bin_tree_node*, bin_tree_node*, int);
  91.   void del_tree(bin_tree_node*);
  92.   bin_tree_node* int_search(GenPtr) const;
  93.   bin_tree_node* search(GenPtr) const;
  94.   bin_tree_node* copy_tree(bin_tree_node*,bin_tree_item&) const;
  95.   // functions depending on actual key type
  96.   // will be defined in dictionary and sortseq templates
  97.   virtual int cmp(GenPtr x, GenPtr y) const { return compare(x,y); }
  98.   virtual void clear_key(GenPtr&) const { }
  99.   virtual void clear_inf(GenPtr&) const { }
  100.   virtual void clear_iinf(GenPtr&)const { }
  101.   virtual void copy_key(GenPtr&)  const { }
  102.   virtual void copy_inf(GenPtr&)  const { }
  103.   virtual void print_key(GenPtr)  const { }
  104.   virtual void print_inf(GenPtr)  const { }
  105.   virtual int  int_type() const { return 0; }
  106.   //bin_tree_node* item(void* p) const { return (bin_tree_node*)p; }
  107. public:
  108.   bin_tree_node* item(void* p) const { return (bin_tree_node*)p; }
  109.   bin_tree_node*& root() const 
  110.                            { return (bin_tree_node*&)ROOT.child[left]; }
  111.   bin_tree_node* cyclic_succ(bin_tree_node* p) const { return p->child[right]; }
  112.   bin_tree_node* cyclic_pred(bin_tree_node* p) const { return p->child[left]; }
  113.   bin_tree_node* succ(bin_tree_node* p) const
  114.   { return (p->child[right] == min_ptr()) ? 0 : p->child[right]; }
  115.   bin_tree_node* pred(bin_tree_node* p) const
  116.   { return (p == min_ptr())  ?  0 : p->child[left] ; }
  117.   bin_tree_node* first_item()  const               { return min_ptr(); }
  118.   bin_tree_node* next_item(bin_tree_node* p) const { return succ(p); }
  119.   bin_tree_node* min() const { return min_ptr(); }
  120.   bin_tree_node* max() const { return (count>0) ? min_ptr()->child[left] : 0; }
  121.   bin_tree& conc(bin_tree&);
  122.   void split_at_item(bin_tree_node*,bin_tree&,bin_tree&);
  123.   void reverse_items(bin_tree_node*,bin_tree_node*);
  124.   bin_tree_node* insert(GenPtr,GenPtr,GenPtr=0);
  125.   bin_tree_node* insert_at_item(bin_tree_node*,GenPtr,GenPtr,GenPtr=0);
  126.   bin_tree_node* lookup(GenPtr) const;
  127.   bin_tree_node* locate(GenPtr) const;
  128.   bin_tree_node* locate_succ(GenPtr) const; 
  129.   bin_tree_node* locate_pred(GenPtr) const; 
  130.   GenPtr   key(bin_tree_node* p)  const { return  p->k; }
  131.   GenPtr   inf(bin_tree_node* p)  const { return  p->i; }
  132.   GenPtr&  info(bin_tree_node* p) const { return  p->i; }
  133.   void del(GenPtr);
  134.   void del_item(bin_tree_node* p);
  135.   void change_inf(bin_tree_node*,GenPtr);
  136.   void clear();
  137.   int size()   const { return count; } 
  138.   int empty()  const { return root() ? false : true ; }
  139.   // construction, assignment, destruction
  140.   bin_tree() {  count = 0; root() = nil; min_ptr() = nil; }
  141.   bin_tree(const bin_tree&);
  142.   bin_tree& operator=(const bin_tree&);
  143.   virtual ~bin_tree() { clear(); }
  144.   // additional operations used by range and segment trees
  145.   virtual void propagate_modification(int, GenPtr, GenPtr) {}
  146.   bin_tree_node* l_child(bin_tree_node* p) const
  147.   { return p->is_leaf() ? 0 : p->child[left]; }
  148.   bin_tree_node* r_child(bin_tree_node* p) const
  149.   { return p->is_leaf() ? 0 : p->child[right]; }
  150.   int is_inner(bin_tree_node* p)  const
  151.   { return p->corr == 0; }
  152.   bin_tree_node* parent(bin_tree_node* p)  const
  153.   { return (p==root()) ? 0 : p->parent; }
  154.   // miscellaneous
  155.   void draw(DRAW_BIN_NODE_FCT, DRAW_BIN_NODE_FCT, DRAW_BIN_EDGE_FCT, 
  156.             bin_tree_node*, double, double, double, double, double);
  157.   void draw(DRAW_BIN_NODE_FCT, DRAW_BIN_NODE_FCT, DRAW_BIN_EDGE_FCT, 
  158.             double, double, double, double);
  159.   void print() const;
  160.   void print_tree(bin_tree_node*,int) const;
  161. };
  162. inline void bin_tree::rotation(bin_tree_node* p,bin_tree_node* q, int dir)
  163. { bin_tree_node* r = q->child[1-dir];
  164.   bin_tree_node* x = p->parent;
  165.   p->child[dir] = r;
  166.   q->child[1-dir] = p;
  167.   p->parent = q;
  168.   r->parent = p;
  169.   if (p == x->child[left])
  170.      x->child[left] = q;
  171.   else
  172.      x->child[right] = q;
  173.   q->parent = x;
  174.   propagate_modification(4,p,r);
  175.   propagate_modification(5,q,p);
  176.   if( x!=&ROOT )
  177.     propagate_modification(6,x,q);
  178.  }
  179. inline void bin_tree::double_rotation(bin_tree_node* p, bin_tree_node* q, 
  180.                                       bin_tree_node* r, int dir1)
  181. { int dir2 = 1-dir1;
  182.   bin_tree_node* s = r->child[dir1];
  183.   bin_tree_node* t = r->child[dir2];
  184.   bin_tree_node* x = p->parent;
  185.   p->child[dir1] = t;
  186.   q->child[dir2] = s;
  187.   r->child[dir1] = q;
  188.   r->child[dir2] = p;
  189.   p->parent = r;
  190.   q->parent = r;
  191.   s->parent = q;
  192.   t->parent = p;
  193.   if (p == x->child[left])
  194.      x->child[left] = r;
  195.   else
  196.      x->child[right] = r;
  197.   r->parent = x;
  198.   propagate_modification(7,p,t);
  199.   propagate_modification(8,q,s);
  200.   propagate_modification(9,r,p);
  201.   propagate_modification(10,r,q);
  202.   if( x!=&ROOT )
  203.     propagate_modification(11,x,r);
  204. }
  205. #if !defined(__TEMPLATE_FUNCTIONS)
  206. // dummy I/O and cmp functions
  207. inline void Print(const bin_tree&,ostream&) { }
  208. inline void Read(bin_tree&, istream&) { }
  209. inline int  compare(const bin_tree&,const bin_tree&) { return 0; }
  210. #endif
  211. #endif