Home | History | Annotate | Download | only in wtf
      1 /*
      2  * Copyright (C) 2008 Apple Inc. All rights reserved.
      3  *
      4  * Based on Abstract AVL Tree Template v1.5 by Walt Karas
      5  * <http://geocities.com/wkaras/gen_cpp/avl_tree.html>.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  * 1.  Redistributions of source code must retain the above copyright
     12  *     notice, this list of conditions and the following disclaimer.
     13  * 2.  Redistributions in binary form must reproduce the above copyright
     14  *     notice, this list of conditions and the following disclaimer in the
     15  *     documentation and/or other materials provided with the distribution.
     16  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     17  *     its contributors may be used to endorse or promote products derived
     18  *     from this software without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     21  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     22  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     23  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     24  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     25  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     26  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     27  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #ifndef AVL_TREE_H_
     33 #define AVL_TREE_H_
     34 
     35 #include "Assertions.h"
     36 #include <wtf/FixedArray.h>
     37 
     38 namespace WTF {
     39 
     40 // Here is the reference class for BSet.
     41 //
     42 // class BSet
     43 //   {
     44 //   public:
     45 //
     46 //     class ANY_bitref
     47 //       {
     48 //       public:
     49 //         operator bool ();
     50 //         void operator = (bool b);
     51 //       };
     52 //
     53 //     // Does not have to initialize bits.
     54 //     BSet();
     55 //
     56 //     // Must return a valid value for index when 0 <= index < maxDepth
     57 //     ANY_bitref operator [] (unsigned index);
     58 //
     59 //     // Set all bits to 1.
     60 //     void set();
     61 //
     62 //     // Set all bits to 0.
     63 //     void reset();
     64 //   };
     65 
     66 template<unsigned maxDepth>
     67 class AVLTreeDefaultBSet {
     68 public:
     69     bool& operator[](unsigned i) { ASSERT(i < maxDepth); return m_data[i]; }
     70     void set() { for (unsigned i = 0; i < maxDepth; ++i) m_data[i] = true; }
     71     void reset() { for (unsigned i = 0; i < maxDepth; ++i) m_data[i] = false; }
     72 
     73 private:
     74     FixedArray<bool, maxDepth> m_data;
     75 };
     76 
     77 // How to determine maxDepth:
     78 // d  Minimum number of nodes
     79 // 2  2
     80 // 3  4
     81 // 4  7
     82 // 5  12
     83 // 6  20
     84 // 7  33
     85 // 8  54
     86 // 9  88
     87 // 10 143
     88 // 11 232
     89 // 12 376
     90 // 13 609
     91 // 14 986
     92 // 15 1,596
     93 // 16 2,583
     94 // 17 4,180
     95 // 18 6,764
     96 // 19 10,945
     97 // 20 17,710
     98 // 21 28,656
     99 // 22 46,367
    100 // 23 75,024
    101 // 24 121,392
    102 // 25 196,417
    103 // 26 317,810
    104 // 27 514,228
    105 // 28 832,039
    106 // 29 1,346,268
    107 // 30 2,178,308
    108 // 31 3,524,577
    109 // 32 5,702,886
    110 // 33 9,227,464
    111 // 34 14,930,351
    112 // 35 24,157,816
    113 // 36 39,088,168
    114 // 37 63,245,985
    115 // 38 102,334,154
    116 // 39 165,580,140
    117 // 40 267,914,295
    118 // 41 433,494,436
    119 // 42 701,408,732
    120 // 43 1,134,903,169
    121 // 44 1,836,311,902
    122 // 45 2,971,215,072
    123 //
    124 // E.g., if, in a particular instantiation, the maximum number of nodes in a tree instance is 1,000,000, the maximum depth should be 28.
    125 // You pick 28 because MN(28) is 832,039, which is less than or equal to 1,000,000, and MN(29) is 1,346,268, which is strictly greater than 1,000,000.
    126 
    127 template <class Abstractor, unsigned maxDepth = 32, class BSet = AVLTreeDefaultBSet<maxDepth> >
    128 class AVLTree {
    129 public:
    130 
    131     typedef typename Abstractor::key key;
    132     typedef typename Abstractor::handle handle;
    133     typedef typename Abstractor::size size;
    134 
    135     enum SearchType {
    136         EQUAL = 1,
    137         LESS = 2,
    138         GREATER = 4,
    139         LESS_EQUAL = EQUAL | LESS,
    140         GREATER_EQUAL = EQUAL | GREATER
    141     };
    142 
    143 
    144     Abstractor& abstractor() { return abs; }
    145 
    146     inline handle insert(handle h);
    147 
    148     inline handle search(key k, SearchType st = EQUAL);
    149     inline handle search_least();
    150     inline handle search_greatest();
    151 
    152     inline handle remove(key k);
    153 
    154     inline handle subst(handle new_node);
    155 
    156     void purge() { abs.root = null(); }
    157 
    158     bool is_empty() { return abs.root == null(); }
    159 
    160     AVLTree() { abs.root = null(); }
    161 
    162     class Iterator {
    163     public:
    164 
    165         // Initialize depth to invalid value, to indicate iterator is
    166         // invalid.   (Depth is zero-base.)
    167         Iterator() { depth = ~0U; }
    168 
    169         void start_iter(AVLTree &tree, key k, SearchType st = EQUAL)
    170         {
    171             // Mask of high bit in an int.
    172             const int MASK_HIGH_BIT = (int) ~ ((~ (unsigned) 0) >> 1);
    173 
    174             // Save the tree that we're going to iterate through in a
    175             // member variable.
    176             tree_ = &tree;
    177 
    178             int cmp, target_cmp;
    179             handle h = tree_->abs.root;
    180             unsigned d = 0;
    181 
    182             depth = ~0U;
    183 
    184             if (h == null())
    185               // Tree is empty.
    186               return;
    187 
    188             if (st & LESS)
    189               // Key can be greater than key of starting node.
    190               target_cmp = 1;
    191             else if (st & GREATER)
    192               // Key can be less than key of starting node.
    193               target_cmp = -1;
    194             else
    195               // Key must be same as key of starting node.
    196               target_cmp = 0;
    197 
    198             for (;;) {
    199                 cmp = cmp_k_n(k, h);
    200                 if (cmp == 0) {
    201                     if (st & EQUAL) {
    202                         // Equal node was sought and found as starting node.
    203                         depth = d;
    204                         break;
    205                     }
    206                     cmp = -target_cmp;
    207                 } else if (target_cmp != 0) {
    208                     if (!((cmp ^ target_cmp) & MASK_HIGH_BIT)) {
    209                         // cmp and target_cmp are both negative or both positive.
    210                         depth = d;
    211                     }
    212                 }
    213                 h = cmp < 0 ? get_lt(h) : get_gt(h);
    214                 if (h == null())
    215                     break;
    216                 branch[d] = cmp > 0;
    217                 path_h[d++] = h;
    218             }
    219         }
    220 
    221         void start_iter_least(AVLTree &tree)
    222         {
    223             tree_ = &tree;
    224 
    225             handle h = tree_->abs.root;
    226 
    227             depth = ~0U;
    228 
    229             branch.reset();
    230 
    231             while (h != null()) {
    232                 if (depth != ~0U)
    233                     path_h[depth] = h;
    234                 depth++;
    235                 h = get_lt(h);
    236             }
    237         }
    238 
    239         void start_iter_greatest(AVLTree &tree)
    240         {
    241             tree_ = &tree;
    242 
    243             handle h = tree_->abs.root;
    244 
    245             depth = ~0U;
    246 
    247             branch.set();
    248 
    249             while (h != null()) {
    250                 if (depth != ~0U)
    251                     path_h[depth] = h;
    252                 depth++;
    253                 h = get_gt(h);
    254             }
    255         }
    256 
    257         handle operator*()
    258         {
    259             if (depth == ~0U)
    260                 return null();
    261 
    262             return depth == 0 ? tree_->abs.root : path_h[depth - 1];
    263         }
    264 
    265         void operator++()
    266         {
    267             if (depth != ~0U) {
    268                 handle h = get_gt(**this);
    269                 if (h == null()) {
    270                     do {
    271                         if (depth == 0) {
    272                             depth = ~0U;
    273                             break;
    274                         }
    275                         depth--;
    276                     } while (branch[depth]);
    277                 } else {
    278                     branch[depth] = true;
    279                     path_h[depth++] = h;
    280                     for (;;) {
    281                         h = get_lt(h);
    282                         if (h == null())
    283                             break;
    284                         branch[depth] = false;
    285                         path_h[depth++] = h;
    286                     }
    287                 }
    288             }
    289         }
    290 
    291         void operator--()
    292         {
    293             if (depth != ~0U) {
    294                 handle h = get_lt(**this);
    295                 if (h == null())
    296                     do {
    297                         if (depth == 0) {
    298                             depth = ~0U;
    299                             break;
    300                         }
    301                         depth--;
    302                     } while (!branch[depth]);
    303                 else {
    304                     branch[depth] = false;
    305                     path_h[depth++] = h;
    306                     for (;;) {
    307                         h = get_gt(h);
    308                         if (h == null())
    309                             break;
    310                         branch[depth] = true;
    311                         path_h[depth++] = h;
    312                     }
    313                 }
    314             }
    315         }
    316 
    317         void operator++(int) { ++(*this); }
    318         void operator--(int) { --(*this); }
    319 
    320     protected:
    321 
    322         // Tree being iterated over.
    323         AVLTree *tree_;
    324 
    325         // Records a path into the tree.  If branch[n] is true, indicates
    326         // take greater branch from the nth node in the path, otherwise
    327         // take the less branch.  branch[0] gives branch from root, and
    328         // so on.
    329         BSet branch;
    330 
    331         // Zero-based depth of path into tree.
    332         unsigned depth;
    333 
    334         // Handles of nodes in path from root to current node (returned by *).
    335         handle path_h[maxDepth - 1];
    336 
    337         int cmp_k_n(key k, handle h) { return tree_->abs.compare_key_node(k, h); }
    338         int cmp_n_n(handle h1, handle h2) { return tree_->abs.compare_node_node(h1, h2); }
    339         handle get_lt(handle h) { return tree_->abs.get_less(h); }
    340         handle get_gt(handle h) { return tree_->abs.get_greater(h); }
    341         handle null() { return tree_->abs.null(); }
    342     };
    343 
    344     template<typename fwd_iter>
    345     bool build(fwd_iter p, size num_nodes)
    346     {
    347         if (num_nodes == 0) {
    348             abs.root = null();
    349             return true;
    350         }
    351 
    352         // Gives path to subtree being built.  If branch[N] is false, branch
    353         // less from the node at depth N, if true branch greater.
    354         BSet branch;
    355 
    356         // If rem[N] is true, then for the current subtree at depth N, it's
    357         // greater subtree has one more node than it's less subtree.
    358         BSet rem;
    359 
    360             // Depth of root node of current subtree.
    361         unsigned depth = 0;
    362 
    363             // Number of nodes in current subtree.
    364         size num_sub = num_nodes;
    365 
    366         // The algorithm relies on a stack of nodes whose less subtree has
    367         // been built, but whose right subtree has not yet been built.  The
    368         // stack is implemented as linked list.  The nodes are linked
    369         // together by having the "greater" handle of a node set to the
    370         // next node in the list.  "less_parent" is the handle of the first
    371         // node in the list.
    372         handle less_parent = null();
    373 
    374         // h is root of current subtree, child is one of its children.
    375         handle h, child;
    376 
    377         for (;;) {
    378             while (num_sub > 2) {
    379                 // Subtract one for root of subtree.
    380                 num_sub--;
    381                 rem[depth] = !!(num_sub & 1);
    382                 branch[depth++] = false;
    383                 num_sub >>= 1;
    384             }
    385 
    386             if (num_sub == 2) {
    387                 // Build a subtree with two nodes, slanting to greater.
    388                 // I arbitrarily chose to always have the extra node in the
    389                 // greater subtree when there is an odd number of nodes to
    390                 // split between the two subtrees.
    391 
    392                 h = *p;
    393                 p++;
    394                 child = *p;
    395                 p++;
    396                 set_lt(child, null());
    397                 set_gt(child, null());
    398                 set_bf(child, 0);
    399                 set_gt(h, child);
    400                 set_lt(h, null());
    401                 set_bf(h, 1);
    402             } else { // num_sub == 1
    403                 // Build a subtree with one node.
    404 
    405                 h = *p;
    406                 p++;
    407                 set_lt(h, null());
    408                 set_gt(h, null());
    409                 set_bf(h, 0);
    410             }
    411 
    412             while (depth) {
    413                 depth--;
    414                 if (!branch[depth])
    415                     // We've completed a less subtree.
    416                     break;
    417 
    418                 // We've completed a greater subtree, so attach it to
    419                 // its parent (that is less than it).  We pop the parent
    420                 // off the stack of less parents.
    421                 child = h;
    422                 h = less_parent;
    423                 less_parent = get_gt(h);
    424                 set_gt(h, child);
    425                 // num_sub = 2 * (num_sub - rem[depth]) + rem[depth] + 1
    426                 num_sub <<= 1;
    427                 num_sub += 1 - rem[depth];
    428                 if (num_sub & (num_sub - 1))
    429                     // num_sub is not a power of 2
    430                     set_bf(h, 0);
    431                 else
    432                     // num_sub is a power of 2
    433                     set_bf(h, 1);
    434             }
    435 
    436             if (num_sub == num_nodes)
    437                 // We've completed the full tree.
    438                 break;
    439 
    440             // The subtree we've completed is the less subtree of the
    441             // next node in the sequence.
    442 
    443             child = h;
    444             h = *p;
    445             p++;
    446             set_lt(h, child);
    447 
    448             // Put h into stack of less parents.
    449             set_gt(h, less_parent);
    450             less_parent = h;
    451 
    452             // Proceed to creating greater than subtree of h.
    453             branch[depth] = true;
    454             num_sub += rem[depth++];
    455 
    456         } // end for (;;)
    457 
    458         abs.root = h;
    459 
    460         return true;
    461     }
    462 
    463 protected:
    464 
    465     friend class Iterator;
    466 
    467     // Create a class whose sole purpose is to take advantage of
    468     // the "empty member" optimization.
    469     struct abs_plus_root : public Abstractor {
    470         // The handle of the root element in the AVL tree.
    471         handle root;
    472     };
    473 
    474     abs_plus_root abs;
    475 
    476 
    477     handle get_lt(handle h) { return abs.get_less(h); }
    478     void set_lt(handle h, handle lh) { abs.set_less(h, lh); }
    479 
    480     handle get_gt(handle h) { return abs.get_greater(h); }
    481     void set_gt(handle h, handle gh) { abs.set_greater(h, gh); }
    482 
    483     int get_bf(handle h) { return abs.get_balance_factor(h); }
    484     void set_bf(handle h, int bf) { abs.set_balance_factor(h, bf); }
    485 
    486     int cmp_k_n(key k, handle h) { return abs.compare_key_node(k, h); }
    487     int cmp_n_n(handle h1, handle h2) { return abs.compare_node_node(h1, h2); }
    488 
    489     handle null() { return abs.null(); }
    490 
    491 private:
    492 
    493     // Balances subtree, returns handle of root node of subtree
    494     // after balancing.
    495     handle balance(handle bal_h)
    496     {
    497         handle deep_h;
    498 
    499         // Either the "greater than" or the "less than" subtree of
    500         // this node has to be 2 levels deeper (or else it wouldn't
    501         // need balancing).
    502 
    503         if (get_bf(bal_h) > 0) {
    504             // "Greater than" subtree is deeper.
    505 
    506             deep_h = get_gt(bal_h);
    507 
    508             if (get_bf(deep_h) < 0) {
    509                 handle old_h = bal_h;
    510                 bal_h = get_lt(deep_h);
    511 
    512                 set_gt(old_h, get_lt(bal_h));
    513                 set_lt(deep_h, get_gt(bal_h));
    514                 set_lt(bal_h, old_h);
    515                 set_gt(bal_h, deep_h);
    516 
    517                 int bf = get_bf(bal_h);
    518                 if (bf != 0) {
    519                     if (bf > 0) {
    520                         set_bf(old_h, -1);
    521                         set_bf(deep_h, 0);
    522                     } else {
    523                         set_bf(deep_h, 1);
    524                         set_bf(old_h, 0);
    525                     }
    526                     set_bf(bal_h, 0);
    527                 } else {
    528                     set_bf(old_h, 0);
    529                     set_bf(deep_h, 0);
    530                 }
    531             } else {
    532                 set_gt(bal_h, get_lt(deep_h));
    533                 set_lt(deep_h, bal_h);
    534                 if (get_bf(deep_h) == 0) {
    535                     set_bf(deep_h, -1);
    536                     set_bf(bal_h, 1);
    537                 } else {
    538                     set_bf(deep_h, 0);
    539                     set_bf(bal_h, 0);
    540                 }
    541                 bal_h = deep_h;
    542             }
    543         } else {
    544             // "Less than" subtree is deeper.
    545 
    546             deep_h = get_lt(bal_h);
    547 
    548             if (get_bf(deep_h) > 0) {
    549                 handle old_h = bal_h;
    550                 bal_h = get_gt(deep_h);
    551                 set_lt(old_h, get_gt(bal_h));
    552                 set_gt(deep_h, get_lt(bal_h));
    553                 set_gt(bal_h, old_h);
    554                 set_lt(bal_h, deep_h);
    555 
    556                 int bf = get_bf(bal_h);
    557                 if (bf != 0) {
    558                     if (bf < 0) {
    559                         set_bf(old_h, 1);
    560                         set_bf(deep_h, 0);
    561                     } else {
    562                         set_bf(deep_h, -1);
    563                         set_bf(old_h, 0);
    564                     }
    565                     set_bf(bal_h, 0);
    566                 } else {
    567                     set_bf(old_h, 0);
    568                     set_bf(deep_h, 0);
    569                 }
    570             } else {
    571                 set_lt(bal_h, get_gt(deep_h));
    572                 set_gt(deep_h, bal_h);
    573                 if (get_bf(deep_h) == 0) {
    574                     set_bf(deep_h, 1);
    575                     set_bf(bal_h, -1);
    576                 } else {
    577                     set_bf(deep_h, 0);
    578                     set_bf(bal_h, 0);
    579                 }
    580                 bal_h = deep_h;
    581             }
    582         }
    583 
    584         return bal_h;
    585     }
    586 
    587 };
    588 
    589 template <class Abstractor, unsigned maxDepth, class BSet>
    590 inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
    591 AVLTree<Abstractor, maxDepth, BSet>::insert(handle h)
    592 {
    593     set_lt(h, null());
    594     set_gt(h, null());
    595     set_bf(h, 0);
    596 
    597     if (abs.root == null())
    598         abs.root = h;
    599     else {
    600         // Last unbalanced node encountered in search for insertion point.
    601         handle unbal = null();
    602         // Parent of last unbalanced node.
    603         handle parent_unbal = null();
    604         // Balance factor of last unbalanced node.
    605         int unbal_bf;
    606 
    607         // Zero-based depth in tree.
    608         unsigned depth = 0, unbal_depth = 0;
    609 
    610         // Records a path into the tree.  If branch[n] is true, indicates
    611         // take greater branch from the nth node in the path, otherwise
    612         // take the less branch.  branch[0] gives branch from root, and
    613         // so on.
    614         BSet branch;
    615 
    616         handle hh = abs.root;
    617         handle parent = null();
    618         int cmp;
    619 
    620         do {
    621             if (get_bf(hh) != 0) {
    622                 unbal = hh;
    623                 parent_unbal = parent;
    624                 unbal_depth = depth;
    625             }
    626             cmp = cmp_n_n(h, hh);
    627             if (cmp == 0)
    628                 // Duplicate key.
    629                 return hh;
    630             parent = hh;
    631             hh = cmp < 0 ? get_lt(hh) : get_gt(hh);
    632             branch[depth++] = cmp > 0;
    633         } while (hh != null());
    634 
    635         //  Add node to insert as leaf of tree.
    636         if (cmp < 0)
    637             set_lt(parent, h);
    638         else
    639             set_gt(parent, h);
    640 
    641         depth = unbal_depth;
    642 
    643         if (unbal == null())
    644             hh = abs.root;
    645         else {
    646             cmp = branch[depth++] ? 1 : -1;
    647             unbal_bf = get_bf(unbal);
    648             if (cmp < 0)
    649                 unbal_bf--;
    650             else  // cmp > 0
    651                 unbal_bf++;
    652             hh = cmp < 0 ? get_lt(unbal) : get_gt(unbal);
    653             if ((unbal_bf != -2) && (unbal_bf != 2)) {
    654                 // No rebalancing of tree is necessary.
    655                 set_bf(unbal, unbal_bf);
    656                 unbal = null();
    657             }
    658         }
    659 
    660         if (hh != null())
    661             while (h != hh) {
    662                 cmp = branch[depth++] ? 1 : -1;
    663                 if (cmp < 0) {
    664                     set_bf(hh, -1);
    665                     hh = get_lt(hh);
    666                 } else { // cmp > 0
    667                     set_bf(hh, 1);
    668                     hh = get_gt(hh);
    669                 }
    670             }
    671 
    672         if (unbal != null()) {
    673             unbal = balance(unbal);
    674             if (parent_unbal == null())
    675                 abs.root = unbal;
    676             else {
    677                 depth = unbal_depth - 1;
    678                 cmp = branch[depth] ? 1 : -1;
    679                 if (cmp < 0)
    680                     set_lt(parent_unbal, unbal);
    681                 else  // cmp > 0
    682                     set_gt(parent_unbal, unbal);
    683             }
    684         }
    685     }
    686 
    687     return h;
    688 }
    689 
    690 template <class Abstractor, unsigned maxDepth, class BSet>
    691 inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
    692 AVLTree<Abstractor, maxDepth, BSet>::search(key k, typename AVLTree<Abstractor, maxDepth, BSet>::SearchType st)
    693 {
    694     const int MASK_HIGH_BIT = (int) ~ ((~ (unsigned) 0) >> 1);
    695 
    696     int cmp, target_cmp;
    697     handle match_h = null();
    698     handle h = abs.root;
    699 
    700     if (st & LESS)
    701         target_cmp = 1;
    702     else if (st & GREATER)
    703         target_cmp = -1;
    704     else
    705         target_cmp = 0;
    706 
    707     while (h != null()) {
    708         cmp = cmp_k_n(k, h);
    709         if (cmp == 0) {
    710             if (st & EQUAL) {
    711                 match_h = h;
    712                 break;
    713             }
    714             cmp = -target_cmp;
    715         } else if (target_cmp != 0)
    716             if (!((cmp ^ target_cmp) & MASK_HIGH_BIT))
    717                 // cmp and target_cmp are both positive or both negative.
    718                 match_h = h;
    719         h = cmp < 0 ? get_lt(h) : get_gt(h);
    720     }
    721 
    722     return match_h;
    723 }
    724 
    725 template <class Abstractor, unsigned maxDepth, class BSet>
    726 inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
    727 AVLTree<Abstractor, maxDepth, BSet>::search_least()
    728 {
    729     handle h = abs.root, parent = null();
    730 
    731     while (h != null()) {
    732         parent = h;
    733         h = get_lt(h);
    734     }
    735 
    736     return parent;
    737 }
    738 
    739 template <class Abstractor, unsigned maxDepth, class BSet>
    740 inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
    741 AVLTree<Abstractor, maxDepth, BSet>::search_greatest()
    742 {
    743     handle h = abs.root, parent = null();
    744 
    745     while (h != null()) {
    746         parent = h;
    747         h = get_gt(h);
    748     }
    749 
    750     return parent;
    751 }
    752 
    753 template <class Abstractor, unsigned maxDepth, class BSet>
    754 inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
    755 AVLTree<Abstractor, maxDepth, BSet>::remove(key k)
    756 {
    757     // Zero-based depth in tree.
    758     unsigned depth = 0, rm_depth;
    759 
    760     // Records a path into the tree.  If branch[n] is true, indicates
    761     // take greater branch from the nth node in the path, otherwise
    762     // take the less branch.  branch[0] gives branch from root, and
    763     // so on.
    764     BSet branch;
    765 
    766     handle h = abs.root;
    767     handle parent = null(), child;
    768     int cmp, cmp_shortened_sub_with_path = 0;
    769 
    770     for (;;) {
    771         if (h == null())
    772             // No node in tree with given key.
    773             return null();
    774         cmp = cmp_k_n(k, h);
    775         if (cmp == 0)
    776             // Found node to remove.
    777             break;
    778         parent = h;
    779         h = cmp < 0 ? get_lt(h) : get_gt(h);
    780         branch[depth++] = cmp > 0;
    781         cmp_shortened_sub_with_path = cmp;
    782     }
    783     handle rm = h;
    784     handle parent_rm = parent;
    785     rm_depth = depth;
    786 
    787     // If the node to remove is not a leaf node, we need to get a
    788     // leaf node, or a node with a single leaf as its child, to put
    789     // in the place of the node to remove.  We will get the greatest
    790     // node in the less subtree (of the node to remove), or the least
    791     // node in the greater subtree.  We take the leaf node from the
    792     // deeper subtree, if there is one.
    793 
    794     if (get_bf(h) < 0) {
    795         child = get_lt(h);
    796         branch[depth] = false;
    797         cmp = -1;
    798     } else {
    799         child = get_gt(h);
    800         branch[depth] = true;
    801         cmp = 1;
    802     }
    803     depth++;
    804 
    805     if (child != null()) {
    806         cmp = -cmp;
    807         do {
    808             parent = h;
    809             h = child;
    810             if (cmp < 0) {
    811                 child = get_lt(h);
    812                 branch[depth] = false;
    813             } else {
    814                 child = get_gt(h);
    815                 branch[depth] = true;
    816             }
    817             depth++;
    818         } while (child != null());
    819 
    820         if (parent == rm)
    821             // Only went through do loop once.  Deleted node will be replaced
    822             // in the tree structure by one of its immediate children.
    823             cmp_shortened_sub_with_path = -cmp;
    824         else
    825             cmp_shortened_sub_with_path = cmp;
    826 
    827         // Get the handle of the opposite child, which may not be null.
    828         child = cmp > 0 ? get_lt(h) : get_gt(h);
    829     }
    830 
    831     if (parent == null())
    832         // There were only 1 or 2 nodes in this tree.
    833         abs.root = child;
    834     else if (cmp_shortened_sub_with_path < 0)
    835         set_lt(parent, child);
    836     else
    837         set_gt(parent, child);
    838 
    839     // "path" is the parent of the subtree being eliminated or reduced
    840     // from a depth of 2 to 1.  If "path" is the node to be removed, we
    841     // set path to the node we're about to poke into the position of the
    842     // node to be removed.
    843     handle path = parent == rm ? h : parent;
    844 
    845     if (h != rm) {
    846         // Poke in the replacement for the node to be removed.
    847         set_lt(h, get_lt(rm));
    848         set_gt(h, get_gt(rm));
    849         set_bf(h, get_bf(rm));
    850         if (parent_rm == null())
    851             abs.root = h;
    852         else {
    853             depth = rm_depth - 1;
    854             if (branch[depth])
    855                 set_gt(parent_rm, h);
    856             else
    857                 set_lt(parent_rm, h);
    858         }
    859     }
    860 
    861     if (path != null()) {
    862         // Create a temporary linked list from the parent of the path node
    863         // to the root node.
    864         h = abs.root;
    865         parent = null();
    866         depth = 0;
    867         while (h != path) {
    868             if (branch[depth++]) {
    869                 child = get_gt(h);
    870                 set_gt(h, parent);
    871             } else {
    872                 child = get_lt(h);
    873                 set_lt(h, parent);
    874             }
    875             parent = h;
    876             h = child;
    877         }
    878 
    879         // Climb from the path node to the root node using the linked
    880         // list, restoring the tree structure and rebalancing as necessary.
    881         bool reduced_depth = true;
    882         int bf;
    883         cmp = cmp_shortened_sub_with_path;
    884         for (;;) {
    885             if (reduced_depth) {
    886                 bf = get_bf(h);
    887                 if (cmp < 0)
    888                     bf++;
    889                 else  // cmp > 0
    890                     bf--;
    891                 if ((bf == -2) || (bf == 2)) {
    892                     h = balance(h);
    893                     bf = get_bf(h);
    894                 } else
    895                     set_bf(h, bf);
    896                 reduced_depth = (bf == 0);
    897             }
    898             if (parent == null())
    899                 break;
    900             child = h;
    901             h = parent;
    902             cmp = branch[--depth] ? 1 : -1;
    903             if (cmp < 0)    {
    904                 parent = get_lt(h);
    905                 set_lt(h, child);
    906             } else {
    907                 parent = get_gt(h);
    908                 set_gt(h, child);
    909             }
    910         }
    911         abs.root = h;
    912     }
    913 
    914     return rm;
    915 }
    916 
    917 template <class Abstractor, unsigned maxDepth, class BSet>
    918 inline typename AVLTree<Abstractor, maxDepth, BSet>::handle
    919 AVLTree<Abstractor, maxDepth, BSet>::subst(handle new_node)
    920 {
    921     handle h = abs.root;
    922     handle parent = null();
    923     int cmp, last_cmp;
    924 
    925     /* Search for node already in tree with same key. */
    926     for (;;) {
    927         if (h == null())
    928             /* No node in tree with same key as new node. */
    929             return null();
    930         cmp = cmp_n_n(new_node, h);
    931         if (cmp == 0)
    932             /* Found the node to substitute new one for. */
    933             break;
    934         last_cmp = cmp;
    935         parent = h;
    936         h = cmp < 0 ? get_lt(h) : get_gt(h);
    937     }
    938 
    939     /* Copy tree housekeeping fields from node in tree to new node. */
    940     set_lt(new_node, get_lt(h));
    941     set_gt(new_node, get_gt(h));
    942     set_bf(new_node, get_bf(h));
    943 
    944     if (parent == null())
    945         /* New node is also new root. */
    946         abs.root = new_node;
    947     else {
    948         /* Make parent point to new node. */
    949         if (last_cmp < 0)
    950             set_lt(parent, new_node);
    951         else
    952             set_gt(parent, new_node);
    953     }
    954 
    955     return h;
    956 }
    957 
    958 }
    959 
    960 #endif
    961