-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrbtree.cpp
82 lines (71 loc) · 1.58 KB
/
rbtree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "rbtree.hpp"
int GetNodeCount(RBNode *h){
if (h == NULL) return 0;
return h->count;
}
bool IsRed(RBNode *h){
if (h == NULL) return false;
return h->red;
}
RBNode* RotateLeft(RBNode *h){
RBNode *x = h->right;
h->right = x->left;
x->left = h;
x->red = h->red;
h->red = true;
x->count = h->count;
h->count = 1 + GetNodeCount(h->left) + GetNodeCount(h->right);
h->maxseqn = (h->right != NULL) ? h->right->maxseqn : h->s;
return x;
}
RBNode* RotateRight(RBNode *h){
RBNode *x = h->left;
h->left = x->right;
x->right = h;
x->red = h->red;
h->red = true;
x->count = h->count;
h->count = 1 + GetNodeCount(h->left) + GetNodeCount(h->right);
x->maxseqn = h->maxseqn;
return x;
}
void FlipColors(RBNode *h){
h->red = !(h->red);
h->left->red = !(h->left->red);
h->right->red = !(h->right->red);
}
RBNode* balance(RBNode *h){
if (IsRed(h->right)) h = RotateLeft(h);
if (IsRed(h->left) && IsRed(h->left->left)) h = RotateRight(h);
if (IsRed(h->left) && IsRed(h->right)) FlipColors(h);
h->count = 1 + GetNodeCount(h->left) + GetNodeCount(h->right);
return h;
}
RBNode* MoveRedLeft(RBNode *h){
FlipColors(h);
if (IsRed(h->right->left)){
h->right = RotateRight(h->right);
h = RotateLeft(h);
}
return h;
}
RBNode* MoveRedRight(RBNode *h){
FlipColors(h);
if (IsRed(h->left->left)){
h = RotateRight(h);
}
return h;
}
RBNode* minimum(RBNode *node){
while (node->left != NULL)
node = node->left;
return node;
}
long long RBTreeDepth(const RBNode *node){
long long depth = 0;
while (node != NULL){
if (!IsRed(node->left)) depth++;
node = node->left;
}
return depth;
}