|
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 |