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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _bin_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. //------------------------------------------------------------------------------
  12. //
  13. //  bin_tree: base class for all binary tree types in LEDA
  14. //
  15. //  leaf oriented & doubly linked 
  16. //
  17. //  Stefan N"aher (1993)
  18. //
  19. //------------------------------------------------------------------------------
  20. #include <LEDA/impl/bin_tree.h>
  21. bin_tree_node* bin_tree::lookup(GenPtr x) const
  22. { bin_tree_node* p = locate(x);
  23.   if (p && cmp(p->k,x) == 0) return p;
  24.   return 0;
  25. }
  26. void  bin_tree::change_inf(bin_tree_node* p,GenPtr y) 
  27. { clear_inf(p->i);
  28.   copy_inf(y);
  29.   p->i = y; 
  30.  }
  31. //------------------------------------------------------------------------------
  32. // locate(x) : returns pointer to leaf with successor or predessor key of x
  33. //------------------------------------------------------------------------------
  34. bin_tree_node* bin_tree::locate(GenPtr x) const
  35.   if (count==0) return 0;
  36.   return  int_type() ? int_search(x) : search(x);
  37. }
  38. //------------------------------------------------------------------------------
  39. // locate_succ(x) : returns pointer to leaf with minimal key >= x
  40. //             nil if tree empty
  41. //------------------------------------------------------------------------------
  42. bin_tree_node* bin_tree::locate_succ(GenPtr x) const
  43. { if (count==0) return 0;
  44.   bin_tree_node* p =  int_type() ? int_search(x) : search(x);
  45.   return (cmp(x,p->k) > 0) ? succ(p) : p ;
  46.  }
  47. //------------------------------------------------------------------------------
  48. // locate_pred(x) : returns pointer to leaf with maximal key <= x
  49. //                  nil if tree empty
  50. //------------------------------------------------------------------------------
  51. bin_tree_node* bin_tree::locate_pred(GenPtr x) const 
  52. { if (count==0) return 0;
  53.   bin_tree_node* p =  int_type() ? int_search(x) : search(x);
  54.   return (cmp(x,p->k) < 0) ? pred(p) : p ;
  55.  }
  56. //------------------------------------------------------------------------------
  57. // search(x) : returns pointer to leaf with minimal key >= x
  58. //------------------------------------------------------------------------------
  59. bin_tree_node* bin_tree::search(GenPtr x) const
  60. {
  61.   bin_tree_node* p = root();
  62.   while (p->is_node())
  63.        p = (cmp(x,p->k) <= 0) ? p->child[left] : p->child[right];
  64.   return p;
  65.  }
  66. //------------------------------------------------------------------------------
  67. // int_search : search for integer key 
  68. //------------------------------------------------------------------------------
  69. bin_tree_node* bin_tree::int_search(GenPtr x) const
  70. {
  71.   bin_tree_node* p = root();
  72.   while (p->is_node())
  73.      if (LEDA_ACCESS(int,x) <= LEDA_ACCESS(int,p->k))
  74.        p =  p->child[left];
  75.      else
  76.        p =  p->child[right];
  77.   return p;
  78.  }
  79. //------------------------------------------------------------------------------
  80. // insert(x,y,ii):
  81. // inserts new leaf with key x and info y, sets info of new inner node to ii
  82. // returns pointer to the new leaf
  83. //------------------------------------------------------------------------------
  84. bin_tree_node* bin_tree::insert( GenPtr x, GenPtr y, GenPtr ii)
  85. {  
  86.   // key x, inf y, iinf ii
  87.   bin_tree_node* p;
  88.    if (count==0)  // tree is empty 
  89.      { copy_key(x);
  90.        copy_inf(y);
  91.        p = new bin_tree_node(x,y,leaf_balance());
  92.        p->corr = &ROOT;
  93.        ROOT.i = ii;
  94.        min_ptr() = p;
  95.        root() = p;
  96.        p->parent = &ROOT;
  97.        p->child[right] = p;
  98.        p->child[left] = p;
  99.        count = 1;
  100.      }
  101.    else
  102.      { p = (int_type()) ? int_search(x) : search(x);
  103.        p = insert_at_item(p,x,y,ii);
  104.       }
  105.    return p ;
  106.  }
  107. bin_tree_node* bin_tree::insert_at_item(bin_tree_node* p, GenPtr x, GenPtr y, 
  108.                                                                     GenPtr ii)
  109. {
  110.    bool insert_left;  //  true <==> insert new leaf q to the left of p
  111.    copy_inf(y);
  112.                    
  113.    if ( int_type() )
  114.      { if ( LEDA_ACCESS(int,x) == LEDA_ACCESS(int,p->k) ) 
  115.        { // x already stored in tree, overwrite info
  116.          clear_inf(p->i);
  117.          p->i = y;
  118.          return p;
  119.         }
  120.        insert_left = (LEDA_ACCESS(int,x) < LEDA_ACCESS(int,p->k));
  121.       }
  122.    else
  123.       { int c = cmp(x,p->k);
  124.         if ( c == 0 )
  125.         { clear_inf(p->i);
  126.           p->i = y;
  127.           return p;
  128.          }
  129.         insert_left = (c < 0);
  130.         copy_key(x);
  131.        }
  132.    int b = (count==1) ? root_balance() : node_balance();
  133.    count++;
  134.    bin_tree_node* q = new bin_tree_node(x,y,leaf_balance()); // new leaf
  135.    bin_tree_node* r = new bin_tree_node(0,0,b);              // new inner node
  136.    bin_tree_node* u = p->parent; 
  137.    q->parent = r;
  138.    p->parent = r;
  139.    r->parent = u;
  140.    r->corr = nil;
  141.    if (p == u->child[left])
  142.       u->child[left] = r;
  143.    else
  144.       u->child[right] = r;
  145.    // insertion of q, adjusting key & inf of corresponding inner nodes,
  146.    // double-chaining with neighbors, checking min pointer, ...
  147.    if (insert_left) // insert q left of p
  148.       { r->k = x;
  149.         q->corr = r;
  150.         r->i = ii;
  151.         r->child[left] = q;
  152.         r->child[right]= p;
  153.         u = p->child[left];
  154.         q->child[left]  = u;
  155.         q->child[right] = p;
  156.         u->child[right] = q;
  157.         p->child[left]  = q;
  158.         if ( p == min_ptr() ) min_ptr() = q;     
  159.        }
  160.     else         // insert q right of p
  161.       { bin_tree_node* pc = p->corr; 
  162.         r->k = p->k;
  163.         r->i = pc->i;
  164.         pc->i = ii;
  165.         q->corr = pc;
  166.         p->corr = r;
  167.         r->child[left] = p;
  168.         r->child[right]= q;
  169.         u = p->child[right];
  170.         q->child[left]  = p;
  171.         q->child[right] = u;
  172.         u->child[left] = q;
  173.         p->child[right] = q;
  174.        }
  175.     propagate_modification(1,r,p);
  176.     propagate_modification(2,r,q);
  177.     if (r != root()) insert_rebal(r);
  178.     return q;
  179. }
  180. //------------------------------------------------------------------------------
  181. // del(x) 
  182. // removes leaf with key x from the tree
  183. // overwrites possible copy of x in an inner node (if key type is not integer)
  184. //------------------------------------------------------------------------------
  185. void bin_tree::del(GenPtr x)
  186. {
  187.   bin_tree_item v;
  188.   if (count == 0) return;  // tree is empty
  189.   if ( int_type() )
  190.     { v = int_search(x);
  191.       if (LEDA_ACCESS(int,v->k) == LEDA_ACCESS(int,x)) del_item(v);
  192.      }
  193.   else
  194.     { v = search(x);
  195.       if ( cmp(v->k,x) == 0 ) del_item(v);
  196.      }
  197.  }
  198. void bin_tree::del_item(bin_tree_item v)
  199. {
  200.   bin_tree_item w;
  201.   bin_tree_item p = v->parent;
  202.   bin_tree_item u = v->corr;
  203.   clear_key(v->k);
  204.   clear_inf(v->i);
  205.   // overwrite copy of key in corresponding inner node u by its predecessor,
  206.   // but keep its information (not necessary in the case that v is a left child)
  207.   if (v != p->child[left]) 
  208.   { bin_tree_node* pred =  v->child[left];
  209.     u->k = pred->k;
  210.     clear_iinf(pred->corr->i);
  211.     pred->corr = u;
  212.   }
  213.   else
  214.     clear_iinf(u->i);
  215.   count--;
  216.  
  217.   if (count == 0)      // tree is now empty
  218.   { root() = min_ptr() = nil;
  219.     delete v;
  220.     return;
  221.    } 
  222.   bin_tree_node* pred = v->child[left];
  223.   bin_tree_node* succ = v->child[right];
  224.   // link neighbors
  225.   pred->child[right] = succ; 
  226.   succ->child[left] = pred;
  227.   // adjust min pointer
  228.   if ( v == min_ptr() ) min_ptr() = succ;
  229.   // replace p by sibling w of v
  230.   u = p->parent;
  231.   w = p->child[left];
  232.   if (v == w) w =  p->child[right];
  233.   w->parent = u;
  234.   if (p == u->child[left])
  235.      u->child[left] = w;
  236.   else
  237.      u->child[right] = w;
  238.                                 //     u             u            u
  239.                                 //     |             |            |
  240.                                 //     p     or      p    --->    w
  241.                                 //    /            / 
  242.                                 //   v   w         w   v
  243.   propagate_modification(3,u,w);
  244.   // rebalance tree, if necessary
  245.   if (w != root()) del_rebal(w,p);
  246.   delete v;
  247.   delete p;
  248. }
  249. //------------------------------------------------------------------
  250. // concatenate
  251. //------------------------------------------------------------------
  252. bin_tree& bin_tree::conc(bin_tree&) 
  253. { error_handler(1,"sorry, bin_tree::conc not implemented"); 
  254.   return *this;
  255.  }
  256. //------------------------------------------------------------------
  257. // split at item
  258. //------------------------------------------------------------------
  259. void bin_tree::split_at_item(bin_tree_node*,bin_tree&,bin_tree&) 
  260. { error_handler(1,"sorry, bin_tree::split_at_item not implemented"); }
  261. //------------------------------------------------------------------
  262. // reverse items
  263. //------------------------------------------------------------------
  264. void bin_tree::reverse_items(bin_tree_node* v, bin_tree_node* w)
  265. {
  266.   bin_tree_node* l = v;
  267.   bin_tree_node* r = w;
  268.   while (l != r && r->child[right] != l) 
  269.   {
  270.     bin_tree_node* pl = l->parent;
  271.     bin_tree_node* pr = r->parent;
  272.     bin_tree_node* cl = l->corr;
  273.     bin_tree_node* cr = r->corr;
  274.     // exchange l and r
  275.    if (pl == pr)
  276.      { pl->child[left] = r;
  277.        pl->child[right] = l;
  278.       }
  279.    else
  280.      { if (l == pl->child[left])
  281.           pl->child[left] = r;
  282.        else
  283.           pl->child[right] = r;
  284.     
  285.        r->parent = pl;
  286.     
  287.        if (r == pr->child[left])
  288.           pr->child[left] = l;
  289.        else
  290.           pr->child[right] = l;
  291.     
  292.        l->parent = pr;
  293.       }
  294.   
  295.    // update corresponding inner nodes
  296.    l->corr = cr;
  297.    cr->k = l->k;
  298.    r->corr = cl;
  299.    cl->k = r->k;
  300.    l = l->child[right]; 
  301.    r = r->child[left];
  302.   }
  303.   // reverse chaining of leaves v...w
  304.   if (count > 2)
  305.   { l = v->child[left];
  306.     r = w->child[right];
  307.   
  308.     r->child[left] = v;
  309.   
  310.     bin_tree_node* p = v; 
  311.   
  312.     while(p != w)
  313.     { bin_tree_node* q = p->child[right];
  314.       p->child[left] = q;
  315.       p = q;
  316.      }
  317.   
  318.     w->child[left] = l;
  319.   
  320.     p = r;
  321.   
  322.     while ( p != l )
  323.     { bin_tree_node* q = p->child[left];
  324.       q->child[right] = p;
  325.       p = q;
  326.      }
  327.    }
  328.   
  329.   // adjust min pointer
  330.   
  331.   if (v == min_ptr()) min_ptr() = w;
  332.  }
  333. //------------------------------------------------------------------
  334. // operator=
  335. //------------------------------------------------------------------
  336. bin_tree& bin_tree::operator=(const bin_tree& t)
  337. {
  338.    if (this == &t) return *this;
  339.    clear();
  340.    if ( t.root() )   
  341.    { bin_tree_node* pre = 0;
  342.      root() = t.copy_tree(t.root(),pre);
  343.      root()->parent = &ROOT;
  344.      pre->corr = &ROOT;
  345.      ROOT.i = t.ROOT.i;
  346.      min_ptr() = root();
  347.      while (min_ptr()->child[left]) min_ptr() = min_ptr()->child[left];
  348.      min_ptr()->child[left] = pre;
  349.      pre->child[right] = min_ptr();
  350.      count = t.count;
  351.    }
  352.    return *this; 
  353. }
  354. //------------------------------------------------------------------
  355. // copy constructor
  356. //------------------------------------------------------------------
  357.   bin_tree::bin_tree(const bin_tree& t)
  358.   { root()  = min_ptr() = 0 ;
  359.     count = t.count; 
  360.     if ( t.root() ) 
  361.     { bin_tree_node* pre = 0;
  362.       root() = t.copy_tree(t.root(),pre);
  363.       min_ptr() = root();
  364.       root()->parent = &ROOT;
  365.       pre->corr = &ROOT;
  366.       while (min_ptr()->child[left]) min_ptr() = min_ptr()->child[left];
  367.       min_ptr()->child[left] = pre;
  368.       pre->child[right] = min_ptr();
  369.      }
  370.   }
  371. //------------------------------------------------------------------
  372. // copy_tree(p) makes a copy of tree with root p and returns a pointer to the
  373. // root of the copy. pre is last created leaf ( leaves are created from left 
  374. // to right).
  375. //------------------------------------------------------------------
  376. bin_tree_node* bin_tree::copy_tree( bin_tree_node* p, bin_tree_item& pre) const
  377. {
  378.   bin_tree_node* q = new bin_tree_node(p);  // q = p
  379.   q->corr = nil;
  380.   if ( p->is_node() )  // internal node: copy subtrees 
  381.   {
  382.     q->child[left] = copy_tree(p->child[left],pre);
  383.     pre->corr = q;
  384.     q->child[right] = copy_tree(p->child[right],pre);
  385.     q->child[left]->parent = q;
  386.     q->child[right]->parent = q;
  387.   }
  388.   else   //leaf: chaining with last created leaf "pre"
  389.   {
  390.     copy_key(q->k);
  391.     copy_inf(q->i);
  392.     if (pre) pre->child[right] = q; 
  393.     q->child[left] = pre;
  394.     pre = q;
  395.    }
  396.   return q;
  397. }
  398. //------------------------------------------------------------------
  399. // clear
  400. //------------------------------------------------------------------
  401. void bin_tree::clear() 
  402. {
  403.    if ( root() )
  404.    { del_tree(root());
  405.      root() = min_ptr() = 0;
  406.      count = 0;
  407.    }
  408. }
  409. //------------------------------------------------------------------
  410. // del_tree(p) : deletes subtree rooted at node p
  411. //------------------------------------------------------------------
  412. void bin_tree::del_tree(bin_tree_node* p)
  413. {
  414.   if ( p->is_node() )
  415.   { del_tree(p->child[left]);
  416.     del_tree(p->child[right]);
  417.    }
  418.   else
  419.   { clear_key(p->k);
  420.     clear_inf(p->i);
  421.     clear_iinf(p->corr->i);
  422.    }
  423.   delete p;
  424. }
  425. //----------------------------------------------------------------------------
  426. // printing and drawing trees
  427. //----------------------------------------------------------------------------
  428. void bin_tree::print() const
  429. { cout << "size = " << size() << endl;
  430.   if ( root() ) print_tree(root(),1);
  431.   newline;
  432. }
  433. void bin_tree::print_tree(bin_tree_node* p,int h) const
  434. {  
  435.   if ( p->is_node() ) print_tree(p->child[right],h+1);
  436.  for( int j=1; j <= h ; j++ ) cout << "     ";
  437.  print_key(key(p));
  438.  cout << " bal=" << p->get_bal();
  439.  if ( p->is_leaf() )
  440.  { cout << " [" << p << "] ";  
  441.    cout << " succ[" << p->child[right] << "] ";  
  442.    cout << " pred[" << p->child[left] << "] "; 
  443.    newline;
  444.  }
  445.  else cout << "n";
  446.  if ( p->is_node() ) print_tree(p->child[left],h+1);
  447. }
  448.         
  449. void bin_tree::draw(DRAW_BIN_NODE_FCT draw_node,
  450.                     DRAW_BIN_NODE_FCT draw_leaf,
  451.                     DRAW_BIN_EDGE_FCT draw_edge, 
  452.                     double x1, double x2, double y, double ydist)
  453.   // draw a picture of the tree using the functions
  454.   // draw_node(x,y,k,b)   draws node with key k and balance b at (x,y)
  455.   // draw_leaf(x,y,k,b)   draws leaf with key k and balance b at (x,y)
  456.   // draw_edge(x,y,x',y') draws an edge from (x,y) to (x',y')
  457.   draw(draw_node,draw_leaf,draw_edge,root(),x1,x2,y,ydist,0); 
  458.  }
  459. void bin_tree::draw(DRAW_BIN_NODE_FCT draw_node,
  460.                     DRAW_BIN_NODE_FCT draw_leaf,
  461.                     DRAW_BIN_EDGE_FCT draw_edge, 
  462.                     bin_tree_node* r, 
  463.                     double x1, double x2, double y, 
  464.                     double ydist, double last_x)
  465.   // draw subtree rooted at r
  466.   double x = (x1+x2)/2;
  467.   if (r==nil) return;
  468.   if (last_x != 0) draw_edge(last_x,y+ydist,x,y);
  469.   if (r->is_node()) 
  470.      { draw_node(x,y,r->k,r->get_bal());
  471.        draw(draw_node,draw_leaf,draw_edge, r->child[0],x1,x,y-ydist,ydist,x);
  472.        draw(draw_node,draw_leaf,draw_edge, r->child[1],x,x2,y-ydist,ydist,x);
  473.       }
  474.   else
  475.      draw_leaf(x,y,r->k,r->get_bal());
  476. }