-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuatBuat.cpp
More file actions
126 lines (110 loc) · 2.35 KB
/
buatBuat.cpp
File metadata and controls
126 lines (110 loc) · 2.35 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <stdio.h>
#include <stdlib.h>
struct data{
int key;
int height;
data *left, *right;
} *root = NULL;
data* createData(int key)
{
data *newData = (data *)malloc(sizeof(data));
newData->key = key;
newData->height = 1;
newData->left = newData->right = NULL;
return newData;
}
void view(data* curr)
{
if(curr)
{
printf("%d ", curr->key);
view(curr->left);
view(curr->right);
}
}
int max(int a, int b)
{
return (a > b) ? a : b;
}
int getHeight(data* curr)
{
if(!curr)
return 0;
else
return curr->height;
}
int getBF(data* curr)
{
if(!curr)
return 0;
else
return getHeight(curr->left) - getHeight(curr->right);
}
data* rightRotation(data* t)
{
data *s = t->left;
data *b = s->right;
t->left = b;
s->right = t;
t->height = 1 + max(getHeight(t->left), getHeight(t->right));
s->height = 1 + max(getHeight(s->left), getHeight(s->right));
return s;
}
data* leftRotation(data* t)
{
data *s = t->right;
data *b = s->left;
t->right = b;
s->left = t;
t->height = 1 + max(getHeight(t->left), getHeight(t->right));
s->height = 1 + max(getHeight(s->left), getHeight(s->right));
return s;
}
data* insertData(data* curr, int key)
{
if(!curr)
{
return createData(key);
}
else if(curr->key < key)
{
curr->right = insertData(curr->right, key);
}
else if(curr->key > key)
{
curr->left = insertData(curr->left, key);
}
else
return curr;
curr->height = 1 + max(getHeight(curr->left), getHeight(curr->right));
int bal = getBF(curr);
if(bal > 1 && getBF(curr->left) >= 0)
{
return rightRotation(curr);
}
else if(bal < -1 && getBF(curr->right) <= 0)
{
return leftRotation(curr);
}
else if(bal > 1 && getBF(curr->left) < 0)
{
curr->left = leftRotation(curr->right);
return rightRotation(curr);
}
else if(bal < -1 && getBF(curr->right) > 0)
{
curr->right = rightRotation(curr->right);
return leftRotation(curr);
}
return curr;
}
int main()
{
root = insertData(root, 10);
root = insertData(root, 20);
root = insertData(root, 30);
root = insertData(root, 40);
root = insertData(root, 50);
root = insertData(root, 25);
view(root);
}