1 changed files with 107 additions and 0 deletions
@ -0,0 +1,107 @@ |
|||
Properties of a rbtree |
|||
====================== |
|||
|
|||
1. A node is either red or black. |
|||
2. The root is black. (This rule is sometimes omitted. Since the root can |
|||
always be changed from red to black, but not necessarily vice-versa, |
|||
this rule has little effect on analysis.) |
|||
3. All leaves (NIL) are black. (All leaves are same color as the |
|||
root.) |
|||
4. Every red node must have two black child nodes. |
|||
5. Every simple path from a given node to any of its |
|||
descendant leaves contains the same number of black nodes. |
|||
|
|||
|
|||
Assumptions in addition to wikipedia |
|||
==================================== |
|||
|
|||
lets assume that NULL pointer are black B nodes. But we mark them with a (N) |
|||
|
|||
|
|||
Example |
|||
======= |
|||
|
|||
we start with the tree from the insert example |
|||
---------------------------------------------- |
|||
|
|||
B(11) |
|||
|
|||
R(8) R(13) |
|||
|
|||
B(3) B(9) B(12) B(16) |
|||
|
|||
B(N) B(N) B(N) R(10) B(N) B(N) B(N) B(N) |
|||
|
|||
B(N) B(N) |
|||
|
|||
we remove R(10) / remove a red node (replace with its child): |
|||
wikipedia explains why this can only happen with two leaf children (our B(N)) |
|||
|
|||
B(11) |
|||
|
|||
R(8) R(13) |
|||
|
|||
B(3) B(9) B(12) B(16) |
|||
|
|||
B(N) B(N) B(N) B(N) B(N) B(N) B(N) B(N) |
|||
|
|||
|
|||
again start with the insert example result |
|||
------------------------------------------ |
|||
|
|||
B(11) |
|||
|
|||
R(8) R(13) |
|||
|
|||
B(3) B(9) B(12) B(16) |
|||
|
|||
B(N) B(N) B(N) R(10) B(N) B(N) B(N) B(N) |
|||
|
|||
B(N) B(N) |
|||
|
|||
remove B(9) (which is the second simple case described on wikipedia) |
|||
M black, C red |
|||
After remove just repaint child black. As I do not replace the node, |
|||
but the value this is simplified in my case to simply do nothing after |
|||
normal delete... :D |
|||
|
|||
B(11) |
|||
|
|||
R(8) R(13) |
|||
|
|||
B(3) B(10) B(12) B(16) |
|||
|
|||
B(N) B(N) B(N) B(N) B(N) B(N) B(N) B(N) |
|||
|
|||
|
|||
again start with the insert example result |
|||
------------------------------------------ |
|||
|
|||
B(11) |
|||
|
|||
R(8) R(13) |
|||
|
|||
B(3) B(9) B(12) B(16) |
|||
|
|||
B(N) B(N) B(N) R(10) B(N) B(N) B(N) B(N) |
|||
|
|||
B(N) B(N) |
|||
|
|||
now lets delete B(3)... which is stated on wikipedia as the complicated case |
|||
where 6 subcases could be distinguished. |
|||
|
|||
Wikipedia says we begin with replacing B(3) which one if its childs, in my |
|||
case this means, setting r(8)->left to NULL.... |
|||
|
|||
So, what is called in on Wikipedia is simply a nullpointer for me...hopefully |
|||
I don't have to do anything with it. |
|||
|
|||
Get an overview over our variables now: |
|||
|
|||
N : Nullpointer set in R(8)->left |
|||
P : R(8) |
|||
S : B(9) |
|||
Sl: Nullpointer |
|||
Sr: R(10) |
|||
|
|||
# vim: set et ts=4: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue