Skip to content

Commit 38f8348

Browse files
committed
head file of RBtree
1 parent 5312dbf commit 38f8348

1 file changed

Lines changed: 62 additions & 0 deletions

File tree

Algorithm/RBtree.h

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include<iostream>
2+
3+
class RBtree
4+
{
5+
struct treenode
6+
{
7+
treenode* parent;
8+
treenode* left;
9+
treenode* right;
10+
int value;
11+
char color;
12+
treenode(treenode* p, int val, int color): parent(p), left(nullptr), right(nullptr), value(val), color(color) {}
13+
};
14+
15+
private:
16+
/*旋转时根节点可能发生变化,维护一个head节点与根节点相互以parent指向
17+
左子节点指向最左(即最小)节点,右子节点指向最右(即最大)节点.
18+
O <-head
19+
|
20+
O <-root
21+
/ \
22+
A B
23+
*/
24+
treenode* head;
25+
int nodecount;
26+
27+
public:
28+
RBtree(): head(new treenode(nullptr, -1, 'r')), nodecount(0)
29+
{
30+
//init
31+
head->left = head;
32+
head->right = head;
33+
}
34+
~RBtree()
35+
{
36+
clearall(head->parent);
37+
delete head;
38+
}
39+
//采用不可重复的插入方式
40+
treenode* insert(const int val);
41+
treenode* find(const int val);
42+
void printbyorder()
43+
{
44+
print(head->parent);
45+
}
46+
47+
private:
48+
//不允许有相同的值,x为插入节点,y为父结点
49+
treenode* insert_unique(treenode* x, treenode* y, const int val);
50+
void left_rotate(treenode* node);
51+
void right_rotate(treenode* node);
52+
//自上而下调整树型
53+
void rebanlance(treenode* node);
54+
void clearall(treenode* root);
55+
void print(treenode* root);
56+
/*
57+
获得比当前节点稍大/小的节点
58+
用于插入时和插入节点比较大小分辨是否有相同的值
59+
*/
60+
treenode* find_larger(treenode* node);
61+
treenode* find_smaller(treenode* node);
62+
};

0 commit comments

Comments
 (0)