rbtree.c 14.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
  Red Black Trees
  (C) 1999  Andrea Arcangeli <andrea@suse.de>
  (C) 2002  David Woodhouse <dwmw2@infradead.org>
  
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

  linux/lib/rbtree.c
*/

#include <linux/rbtree.h>
24
#include <linux/export.h>
L
Linus Torvalds 已提交
25

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
/*
 * red-black trees properties:  http://en.wikipedia.org/wiki/Rbtree
 *
 *  1) A node is either red or black
 *  2) The root is black
 *  3) All leaves (NULL) are black
 *  4) Both children of every red node are black
 *  5) Every simple path from root to leaves contains the same number
 *     of black nodes.
 *
 *  4 and 5 give the O(log n) guarantee, since 4 implies you cannot have two
 *  consecutive red nodes in a path and every red node is therefore followed by
 *  a black. So if B is the number of black nodes on every simple path (as per
 *  5), then the longest possible path due to 4 is 2B.
 *
 *  We shall indicate color with case, where black nodes are uppercase and red
 *  nodes will be lowercase.
 */

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
#define	RB_RED		0
#define	RB_BLACK	1

#define rb_color(r)   ((r)->__rb_parent_color & 1)
#define rb_is_red(r)   (!rb_color(r))
#define rb_is_black(r) rb_color(r)
#define rb_set_red(r)  do { (r)->__rb_parent_color &= ~1; } while (0)
#define rb_set_black(r)  do { (r)->__rb_parent_color |= 1; } while (0)

static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p)
{
	rb->__rb_parent_color = rb_color(rb) | (unsigned long)p;
}
static inline void rb_set_color(struct rb_node *rb, int color)
{
	rb->__rb_parent_color = (rb->__rb_parent_color & ~1) | color;
}

63 64 65 66 67 68 69 70 71 72 73
static inline void rb_set_parent_color(struct rb_node *rb,
				       struct rb_node *p, int color)
{
	rb->__rb_parent_color = (unsigned long)p | color;
}

static inline struct rb_node *rb_red_parent(struct rb_node *red)
{
	return (struct rb_node *)red->__rb_parent_color;
}

L
Linus Torvalds 已提交
74 75 76
static void __rb_rotate_left(struct rb_node *node, struct rb_root *root)
{
	struct rb_node *right = node->rb_right;
77
	struct rb_node *parent = rb_parent(node);
L
Linus Torvalds 已提交
78 79

	if ((node->rb_right = right->rb_left))
80
		rb_set_parent(right->rb_left, node);
L
Linus Torvalds 已提交
81 82
	right->rb_left = node;

83 84 85
	rb_set_parent(right, parent);

	if (parent)
L
Linus Torvalds 已提交
86
	{
87 88
		if (node == parent->rb_left)
			parent->rb_left = right;
L
Linus Torvalds 已提交
89
		else
90
			parent->rb_right = right;
L
Linus Torvalds 已提交
91 92 93
	}
	else
		root->rb_node = right;
94
	rb_set_parent(node, right);
L
Linus Torvalds 已提交
95 96 97 98 99
}

static void __rb_rotate_right(struct rb_node *node, struct rb_root *root)
{
	struct rb_node *left = node->rb_left;
100
	struct rb_node *parent = rb_parent(node);
L
Linus Torvalds 已提交
101 102

	if ((node->rb_left = left->rb_right))
103
		rb_set_parent(left->rb_right, node);
L
Linus Torvalds 已提交
104 105
	left->rb_right = node;

106 107 108
	rb_set_parent(left, parent);

	if (parent)
L
Linus Torvalds 已提交
109
	{
110 111
		if (node == parent->rb_right)
			parent->rb_right = left;
L
Linus Torvalds 已提交
112
		else
113
			parent->rb_left = left;
L
Linus Torvalds 已提交
114 115 116
	}
	else
		root->rb_node = left;
117
	rb_set_parent(node, left);
L
Linus Torvalds 已提交
118 119
}

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
/*
 * Helper function for rotations:
 * - old's parent and color get assigned to new
 * - old gets assigned new as a parent and 'color' as a color.
 */
static inline void
__rb_rotate_set_parents(struct rb_node *old, struct rb_node *new,
			struct rb_root *root, int color)
{
	struct rb_node *parent = rb_parent(old);
	new->__rb_parent_color = old->__rb_parent_color;
	rb_set_parent_color(old, new, color);
	if (parent) {
		if (parent->rb_left == old)
			parent->rb_left = new;
		else
			parent->rb_right = new;
	} else
		root->rb_node = new;
}

L
Linus Torvalds 已提交
141 142
void rb_insert_color(struct rb_node *node, struct rb_root *root)
{
143
	struct rb_node *parent = rb_red_parent(node), *gparent, *tmp;
L
Linus Torvalds 已提交
144

145 146 147 148 149 150 151 152 153
	while (true) {
		/*
		 * Loop invariant: node is red
		 *
		 * If there is a black parent, we are done.
		 * Otherwise, take some corrective action as we don't
		 * want a red root or two consecutive red nodes.
		 */
		if (!parent) {
154
			rb_set_parent_color(node, NULL, RB_BLACK);
155 156 157 158
			break;
		} else if (rb_is_black(parent))
			break;

159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
		gparent = rb_red_parent(parent);

		if (parent == gparent->rb_left) {
			tmp = gparent->rb_right;
			if (tmp && rb_is_red(tmp)) {
				/*
				 * Case 1 - color flips
				 *
				 *       G            g
				 *      / \          / \
				 *     p   u  -->   P   U
				 *    /            /
				 *   n            N
				 *
				 * However, since g's parent might be red, and
				 * 4) does not allow this, we need to recurse
				 * at g.
				 */
				rb_set_parent_color(tmp, gparent, RB_BLACK);
				rb_set_parent_color(parent, gparent, RB_BLACK);
				node = gparent;
				parent = rb_parent(node);
				rb_set_parent_color(node, parent, RB_RED);
				continue;
L
Linus Torvalds 已提交
183 184
			}

185
			if (parent->rb_right == node) {
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
				/*
				 * Case 2 - left rotate at parent
				 *
				 *      G             G
				 *     / \           / \
				 *    p   U  -->    n   U
				 *     \           /
				 *      n         p
				 *
				 * This still leaves us in violation of 4), the
				 * continuation into Case 3 will fix that.
				 */
				parent->rb_right = tmp = node->rb_left;
				node->rb_left = parent;
				if (tmp)
					rb_set_parent_color(tmp, parent,
							    RB_BLACK);
				rb_set_parent_color(parent, node, RB_RED);
L
Linus Torvalds 已提交
204 205 206
				parent = node;
			}

207 208 209 210 211 212 213 214 215 216 217 218 219 220
			/*
			 * Case 3 - right rotate at gparent
			 *
			 *        G           P
			 *       / \         / \
			 *      p   U  -->  n   g
			 *     /                 \
			 *    n                   U
			 */
			gparent->rb_left = tmp = parent->rb_right;
			parent->rb_right = gparent;
			if (tmp)
				rb_set_parent_color(tmp, gparent, RB_BLACK);
			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
221
			break;
L
Linus Torvalds 已提交
222
		} else {
223 224 225 226 227 228 229 230 231
			tmp = gparent->rb_left;
			if (tmp && rb_is_red(tmp)) {
				/* Case 1 - color flips */
				rb_set_parent_color(tmp, gparent, RB_BLACK);
				rb_set_parent_color(parent, gparent, RB_BLACK);
				node = gparent;
				parent = rb_parent(node);
				rb_set_parent_color(node, parent, RB_RED);
				continue;
L
Linus Torvalds 已提交
232 233
			}

234
			if (parent->rb_left == node) {
235 236 237 238 239 240 241
				/* Case 2 - right rotate at parent */
				parent->rb_left = tmp = node->rb_right;
				node->rb_right = parent;
				if (tmp)
					rb_set_parent_color(tmp, parent,
							    RB_BLACK);
				rb_set_parent_color(parent, node, RB_RED);
L
Linus Torvalds 已提交
242 243 244
				parent = node;
			}

245 246 247 248 249 250
			/* Case 3 - left rotate at gparent */
			gparent->rb_right = tmp = parent->rb_left;
			parent->rb_left = gparent;
			if (tmp)
				rb_set_parent_color(tmp, gparent, RB_BLACK);
			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
251
			break;
L
Linus Torvalds 已提交
252 253 254 255 256 257 258 259 260 261
		}
	}
}
EXPORT_SYMBOL(rb_insert_color);

static void __rb_erase_color(struct rb_node *node, struct rb_node *parent,
			     struct rb_root *root)
{
	struct rb_node *other;

262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
	while (true) {
		/*
		 * Loop invariant: all leaf paths going through node have a
		 * black node count that is 1 lower than other leaf paths.
		 *
		 * If node is red, we can flip it to black to adjust.
		 * If node is the root, all leaf paths go through it.
		 * Otherwise, we need to adjust the tree through color flips
		 * and tree rotations as per one of the 4 cases below.
		 */
		if (node && rb_is_red(node)) {
			rb_set_black(node);
			break;
		} else if (!parent) {
			break;
		} else if (parent->rb_left == node) {
L
Linus Torvalds 已提交
278
			other = parent->rb_right;
279
			if (rb_is_red(other))
L
Linus Torvalds 已提交
280
			{
281 282
				rb_set_black(other);
				rb_set_red(parent);
L
Linus Torvalds 已提交
283 284 285
				__rb_rotate_left(parent, root);
				other = parent->rb_right;
			}
286 287 288
			if (!other->rb_right || rb_is_black(other->rb_right)) {
				if (!other->rb_left ||
				    rb_is_black(other->rb_left)) {
289
					rb_set_red(other);
290 291 292
					node = parent;
					parent = rb_parent(node);
					continue;
L
Linus Torvalds 已提交
293
				}
294 295 296 297
				rb_set_black(other->rb_left);
				rb_set_red(other);
				__rb_rotate_right(other, root);
				other = parent->rb_right;
L
Linus Torvalds 已提交
298
			}
299 300 301 302 303
			rb_set_color(other, rb_color(parent));
			rb_set_black(parent);
			rb_set_black(other->rb_right);
			__rb_rotate_left(parent, root);
			break;
304
		} else {
L
Linus Torvalds 已提交
305
			other = parent->rb_left;
306
			if (rb_is_red(other))
L
Linus Torvalds 已提交
307
			{
308 309
				rb_set_black(other);
				rb_set_red(parent);
L
Linus Torvalds 已提交
310 311 312
				__rb_rotate_right(parent, root);
				other = parent->rb_left;
			}
313 314 315
			if (!other->rb_left || rb_is_black(other->rb_left)) {
				if (!other->rb_right ||
				    rb_is_black(other->rb_right)) {
316
					rb_set_red(other);
317 318 319
					node = parent;
					parent = rb_parent(node);
					continue;
L
Linus Torvalds 已提交
320
				}
321 322 323 324
				rb_set_black(other->rb_right);
				rb_set_red(other);
				__rb_rotate_left(other, root);
				other = parent->rb_left;
L
Linus Torvalds 已提交
325
			}
326 327 328 329 330
			rb_set_color(other, rb_color(parent));
			rb_set_black(parent);
			rb_set_black(other->rb_left);
			__rb_rotate_right(parent, root);
			break;
L
Linus Torvalds 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
		}
	}
}

void rb_erase(struct rb_node *node, struct rb_root *root)
{
	struct rb_node *child, *parent;
	int color;

	if (!node->rb_left)
		child = node->rb_right;
	else if (!node->rb_right)
		child = node->rb_left;
	else
	{
		struct rb_node *old = node, *left;

		node = node->rb_right;
		while ((left = node->rb_left) != NULL)
			node = left;
351 352 353 354 355 356 357 358 359

		if (rb_parent(old)) {
			if (rb_parent(old)->rb_left == old)
				rb_parent(old)->rb_left = node;
			else
				rb_parent(old)->rb_right = node;
		} else
			root->rb_node = node;

L
Linus Torvalds 已提交
360
		child = node->rb_right;
361
		parent = rb_parent(node);
362
		color = rb_color(node);
L
Linus Torvalds 已提交
363

364
		if (parent == old) {
L
Linus Torvalds 已提交
365
			parent = node;
366 367 368
		} else {
			if (child)
				rb_set_parent(child, parent);
369
			parent->rb_left = child;
370 371 372

			node->rb_right = old->rb_right;
			rb_set_parent(old->rb_right, node);
373
		}
374

375
		node->__rb_parent_color = old->__rb_parent_color;
L
Linus Torvalds 已提交
376
		node->rb_left = old->rb_left;
377
		rb_set_parent(old->rb_left, node);
378

L
Linus Torvalds 已提交
379 380 381
		goto color;
	}

382
	parent = rb_parent(node);
383
	color = rb_color(node);
L
Linus Torvalds 已提交
384 385

	if (child)
386
		rb_set_parent(child, parent);
387 388
	if (parent)
	{
L
Linus Torvalds 已提交
389 390 391 392
		if (parent->rb_left == node)
			parent->rb_left = child;
		else
			parent->rb_right = child;
393
	}
394 395
	else
		root->rb_node = child;
L
Linus Torvalds 已提交
396 397 398 399 400 401 402

 color:
	if (color == RB_BLACK)
		__rb_erase_color(child, parent, root);
}
EXPORT_SYMBOL(rb_erase);

403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
static void rb_augment_path(struct rb_node *node, rb_augment_f func, void *data)
{
	struct rb_node *parent;

up:
	func(node, data);
	parent = rb_parent(node);
	if (!parent)
		return;

	if (node == parent->rb_left && parent->rb_right)
		func(parent->rb_right, data);
	else if (parent->rb_left)
		func(parent->rb_left, data);

	node = parent;
	goto up;
}

/*
 * after inserting @node into the tree, update the tree to account for
 * both the new entry and any damage done by rebalance
 */
void rb_augment_insert(struct rb_node *node, rb_augment_f func, void *data)
{
	if (node->rb_left)
		node = node->rb_left;
	else if (node->rb_right)
		node = node->rb_right;

	rb_augment_path(node, func, data);
}
435
EXPORT_SYMBOL(rb_augment_insert);
436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460

/*
 * before removing the node, find the deepest node on the rebalance path
 * that will still be there after @node gets removed
 */
struct rb_node *rb_augment_erase_begin(struct rb_node *node)
{
	struct rb_node *deepest;

	if (!node->rb_right && !node->rb_left)
		deepest = rb_parent(node);
	else if (!node->rb_right)
		deepest = node->rb_left;
	else if (!node->rb_left)
		deepest = node->rb_right;
	else {
		deepest = rb_next(node);
		if (deepest->rb_right)
			deepest = deepest->rb_right;
		else if (rb_parent(deepest) != node)
			deepest = rb_parent(deepest);
	}

	return deepest;
}
461
EXPORT_SYMBOL(rb_augment_erase_begin);
462 463 464 465 466 467 468 469 470 471

/*
 * after removal, update the tree to account for the removed entry
 * and any rebalance damage.
 */
void rb_augment_erase_end(struct rb_node *node, rb_augment_f func, void *data)
{
	if (node)
		rb_augment_path(node, func, data);
}
472
EXPORT_SYMBOL(rb_augment_erase_end);
473

L
Linus Torvalds 已提交
474 475 476
/*
 * This function returns the first node (in sort order) of the tree.
 */
477
struct rb_node *rb_first(const struct rb_root *root)
L
Linus Torvalds 已提交
478 479 480 481 482 483 484 485 486 487 488 489
{
	struct rb_node	*n;

	n = root->rb_node;
	if (!n)
		return NULL;
	while (n->rb_left)
		n = n->rb_left;
	return n;
}
EXPORT_SYMBOL(rb_first);

490
struct rb_node *rb_last(const struct rb_root *root)
L
Linus Torvalds 已提交
491 492 493 494 495 496 497 498 499 500 501 502
{
	struct rb_node	*n;

	n = root->rb_node;
	if (!n)
		return NULL;
	while (n->rb_right)
		n = n->rb_right;
	return n;
}
EXPORT_SYMBOL(rb_last);

503
struct rb_node *rb_next(const struct rb_node *node)
L
Linus Torvalds 已提交
504
{
505 506
	struct rb_node *parent;

507
	if (RB_EMPTY_NODE(node))
508 509
		return NULL;

L
Linus Torvalds 已提交
510 511 512 513 514 515
	/* If we have a right-hand child, go down and then left as far
	   as we can. */
	if (node->rb_right) {
		node = node->rb_right; 
		while (node->rb_left)
			node=node->rb_left;
516
		return (struct rb_node *)node;
L
Linus Torvalds 已提交
517 518 519 520 521 522 523 524
	}

	/* No right-hand children.  Everything down and left is
	   smaller than us, so any 'next' node must be in the general
	   direction of our parent. Go up the tree; any time the
	   ancestor is a right-hand child of its parent, keep going
	   up. First time it's a left-hand child of its parent, said
	   parent is our 'next' node. */
525 526
	while ((parent = rb_parent(node)) && node == parent->rb_right)
		node = parent;
L
Linus Torvalds 已提交
527

528
	return parent;
L
Linus Torvalds 已提交
529 530 531
}
EXPORT_SYMBOL(rb_next);

532
struct rb_node *rb_prev(const struct rb_node *node)
L
Linus Torvalds 已提交
533
{
534 535
	struct rb_node *parent;

536
	if (RB_EMPTY_NODE(node))
537 538
		return NULL;

L
Linus Torvalds 已提交
539 540 541 542 543 544
	/* If we have a left-hand child, go down and then right as far
	   as we can. */
	if (node->rb_left) {
		node = node->rb_left; 
		while (node->rb_right)
			node=node->rb_right;
545
		return (struct rb_node *)node;
L
Linus Torvalds 已提交
546 547 548 549
	}

	/* No left-hand children. Go up till we find an ancestor which
	   is a right-hand child of its parent */
550 551
	while ((parent = rb_parent(node)) && node == parent->rb_left)
		node = parent;
L
Linus Torvalds 已提交
552

553
	return parent;
L
Linus Torvalds 已提交
554 555 556 557 558 559
}
EXPORT_SYMBOL(rb_prev);

void rb_replace_node(struct rb_node *victim, struct rb_node *new,
		     struct rb_root *root)
{
560
	struct rb_node *parent = rb_parent(victim);
L
Linus Torvalds 已提交
561 562 563 564 565 566 567 568 569 570 571

	/* Set the surrounding nodes to point to the replacement */
	if (parent) {
		if (victim == parent->rb_left)
			parent->rb_left = new;
		else
			parent->rb_right = new;
	} else {
		root->rb_node = new;
	}
	if (victim->rb_left)
572
		rb_set_parent(victim->rb_left, new);
L
Linus Torvalds 已提交
573
	if (victim->rb_right)
574
		rb_set_parent(victim->rb_right, new);
L
Linus Torvalds 已提交
575 576 577 578 579

	/* Copy the pointers/colour from the victim to the replacement */
	*new = *victim;
}
EXPORT_SYMBOL(rb_replace_node);