forked from codesession/Data-structure-Algorithm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRBtree.h
More file actions
62 lines (58 loc) · 1.38 KB
/
RBtree.h
File metadata and controls
62 lines (58 loc) · 1.38 KB
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
#include<iostream>
class RBtree
{
struct treenode
{
treenode* parent;
treenode* left;
treenode* right;
int value;
char color;
treenode(treenode* p, int val, int color): parent(p), left(nullptr), right(nullptr), value(val), color(color) {}
};
private:
/*旋转时根节点可能发生变化,维护一个head节点与根节点相互以parent指向
左子节点指向最左(即最小)节点,右子节点指向最右(即最大)节点.
O <-head
|
O <-root
/ \
A B
*/
treenode* head;
int nodecount;
public:
RBtree(): head(new treenode(nullptr, -1, 'r')), nodecount(0)
{
//init
head->left = head;
head->right = head;
}
~RBtree()
{
clearall(head->parent);
delete head;
}
//采用不可重复的插入方式
treenode* insert(const int val);
treenode* find(const int val);
void printbyorder()
{
print(head->parent);
}
private:
//不允许有相同的值,x为插入节点,y为父结点
treenode* insert_unique(treenode* x, treenode* y, const int val);
void left_rotate(treenode* node);
void right_rotate(treenode* node);
//自上而下调整树型
void rebanlance(treenode* node);
void clearall(treenode* root);
void print(treenode* root);
/*
获得比当前节点稍大/小的节点
用于插入时和插入节点比较大小分辨是否有相同的值
*/
treenode* find_larger(treenode* node);
treenode* find_smaller(treenode* node);
};