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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _avl_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. #include <LEDA/impl/avl_tree.h>
  12. //----------------------------------------------------------------------------
  13. //  avl_tree:
  14. //
  15. //  rebalancing routines for AVL trees
  16. //
  17. //----------------------------------------------------------------------------
  18. void avl_tree::insert_rebal(avl_tree_item v)
  19. {
  20.   // preconditions:  v is new node created by insertion
  21.   //                 v != root
  22.   //                 height(v) == 1, bal(v) == 0;
  23.   // bal(v) == height(R) - height(L)           
  24.   //                    u
  25.   //                    |
  26.   //                    v
  27.   //                   / 
  28.   //                  L   R
  29.   //
  30.   
  31.   while ( v != root() )
  32.   {
  33.     avl_tree_item u = v->parent;
  34.     int dir = (v == u->child[left]) ? left : right;
  35.     int b = u->get_bal();
  36.     if (dir==left)   // insertion in left subtree of u 
  37.        b--;
  38.     else             // insertion in right subtree of u
  39.        b++; 
  40.     u->set_bal(b);
  41.     if (b==0)  break;   // height of u has not changed 
  42.     if (b != 1 && b != -1)
  43.     { 
  44.       // u is out of balance (-2 or + 2)
  45.       int d = (b < 0) ? -1 : +1;
  46.   
  47.       avl_tree_item w = u->child[dir];
  48.   
  49.       if (w->get_bal() == d)
  50.       { rotation(u,w,dir);
  51.         u->set_bal(0);
  52.         w->set_bal(0);
  53.        }
  54.       else
  55.       { avl_tree_item x = w->child[1-dir];
  56.         double_rotation(u,w,x,dir);
  57.         if (x->get_bal() == d)
  58.            u->set_bal(-d);
  59.         else
  60.            u->set_bal(0);
  61.   
  62.         if (x->get_bal() == -d)
  63.            w->set_bal(d);
  64.         else
  65.            w->set_bal(0);
  66.   
  67.         x->set_bal(0);
  68.        }
  69.   
  70.       break;
  71.     }
  72.     v = u;
  73.   }
  74. }
  75. void avl_tree::del_rebal(avl_tree_item v, avl_tree_item)
  76. {
  77.   // precondition:    p is removed inner node
  78.   //                  v is remaining child of p (already linked to parent u)
  79.   //                  v != root
  80.   
  81.   while ( v != root() )
  82.   {
  83.     avl_tree_item u = v->parent;
  84.     int dir = (v == u->child[left]) ? left : right;
  85.     int b = u->get_bal();
  86.     if (dir==left)  // deletion in left  subtree of u
  87.        b++;
  88.     else            // deletion in right subtree of u
  89.        b--;
  90.     u->set_bal(b);
  91.     if (b == 1 || b == -1) break;   // height of u has not changed
  92.     if (b != 0)
  93.     { 
  94.       // u is out of balance (-2 or + 2)
  95.       int d = (b < 0) ? -1 : +1;
  96.   
  97.       avl_tree_item w = u->child[1-dir];
  98.   
  99.       if (d * w->get_bal() >= 0)
  100.       { rotation(u,w,1-dir);
  101.         if (w->get_bal() == 0)
  102.           { u->set_bal(d);
  103.             w->set_bal(-d);
  104.             break;
  105.            }
  106.         else
  107.           { u->set_bal(0);
  108.             w->set_bal(0);
  109.            }
  110.         v = w;
  111.        }
  112.       else
  113.       { avl_tree_item x = w->child[dir];
  114.         double_rotation(u,w,x,1-dir);
  115.         if (x->get_bal() == d)
  116.            u->set_bal(-d);
  117.         else
  118.            u->set_bal(0);
  119.   
  120.         if (x->get_bal() == -d)
  121.            w->set_bal(d);
  122.         else
  123.            w->set_bal(0);
  124.   
  125.         x->set_bal(0);
  126.         v = x;
  127.        }
  128.     }
  129.     else v = u;
  130.   }
  131. }