forked from dharmanshu1921/Java
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AVL_Tree_Implementation.cpp
129 lines (115 loc) · 2.43 KB
/
AVL_Tree_Implementation.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
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
127
128
129
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
class node
{
public:
int data;
node *left, *right;
int height;
static node *newnode(int x)
{
node *newnode = new node;
newnode->data = x;
newnode->left = newnode->right = NULL;
newnode->height = 0;
return newnode;
}
};
int height(node *p)
{
if (p)
return p->height;
return -1;
}
node *LLRotation(node *p)
{
node *x = p->left;
node *t = x->right;
p->left = t;
x->right = p;
p->height = max(height(p->right), height(p->left)) + 1;
x->height = max(height(x->right), height(x->left)) + 1;
return x;
}
node *RRRotation(node *p)
{
node *x = p->right;
node *t = x->left;
p->right = t;
x->left = p;
p->height = max(height(p->right), height(p->left)) + 1;
x->height = max(height(x->right), height(x->left)) + 1;
return x;
}
int bf(node *p)
{
if (p)
return height(p->left) - height(p->right);
return -1;
}
class AVL
{
node *root;
node *add(node *p, int x)
{
if (p == NULL)
return node::newnode(x);
if (x < p->data)
p->left = add(p->left, x);
else if (x > p->data)
p->right = add(p->right, x);
p->height = max(height(p->right), height(p->left)) + 1;
int balanceFactor = bf(p);
if (balanceFactor == 2 && bf(p->left) == 1)
return LLRotation(p);
if (balanceFactor == -2 && bf(p->right) == -1)
return RRRotation(p);
if (balanceFactor == 2 && bf(p->left) == -1)
{
p->left = RRRotation(p->left);
return LLRotation(p);
}
if (balanceFactor == -2 && bf(p->right) == 1)
{
p->right = LLRotation(p->right);
return RRRotation(p);
}
return p;
}
void inorderTraversal(node *p)
{
if (p)
{
inorderTraversal(p->left);
cout << p->data << " ";
inorderTraversal(p->right);
}
}
public:
AVL() { root = NULL; }
void insert(int x)
{
root = add(root, x);
}
void inorderDisplay()
{
inorderTraversal(root);
}
node *getRoot() { return root; }
};
int main()
{
AVL a;
int n;
cin >> n;
int x;
for (int i = 0; i < n; i++)
{
cin >> x;
a.insert(x);
}
a.inorderDisplay();
return 0;
}