-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAVL tree.cpp
More file actions
141 lines (110 loc) · 3.11 KB
/
Copy pathAVL tree.cpp
File metadata and controls
141 lines (110 loc) · 3.11 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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//AVL Tree Data 35,50,40,25,30,60,78,20,28
#include <iostream>
using namespace std;
// AVL tree node
class Node {
public:
int value;
Node* left;
Node* right;
int height;
Node(int value) {
this->value = value;
left = nullptr;
right = nullptr;
height = 1;
}
};
// AVL tree class
class AVLTree {
public:
Node* root;
AVLTree() {
root = nullptr;
}
// Get the height of a node
int getHeight(Node* node) {
if (node == nullptr)
return 0;
return node->height;
}
// Get the balance factor of a node
int getBalance(Node* node) {
if (node == nullptr)
return 0;
return getHeight(node->left) - getHeight(node->right);
}
// Perform right rotation
Node* rightRotate(Node* z) {
Node* y = z->left;
Node* T3 = y->right;
y->right = z;
z->left = T3;
z->height = 1 + max(getHeight(z->left), getHeight(z->right));
y->height = 1 + max(getHeight(y->left), getHeight(y->right));
return y;
}
// Perform left rotation
Node* leftRotate(Node* z) {
Node* y = z->right;
Node* T2 = y->left;
y->left = z;
z->right = T2;
z->height = 1 + max(getHeight(z->left), getHeight(z->right));
y->height = 1 + max(getHeight(y->left), getHeight(y->right));
return y;
}
// Insert a node into the AVL tree
Node* insert(Node* node, int value) {
if (node == nullptr)
return new Node(value);
if (value < node->value)
node->left = insert(node->left, value);
else
node->right = insert(node->right, value);
node->height = 1 + max(getHeight(node->left), getHeight(node->right));
int balance = getBalance(node);
// Left Left Case
if (balance > 1 && value < node->left->value)
return rightRotate(node);
// Right Right Case
if (balance < -1 && value > node->right->value)
return leftRotate(node);
// Left Right Case
if (balance > 1 && value > node->left->value) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
// Right Left Case
if (balance < -1 && value < node->right->value) {
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
// Inorder traversal of the AVL tree
void inorder(Node* node) {
if (node) {
inorder(node->left);
cout << node->value << " ";
inorder(node->right);
}
}
};
int main() {
AVLTree avlTree;
int numNodes;
cout << "Enter the number of nodes to insert: ";
cin >> numNodes;
cout << "Enter the values to insert: ";
for (int i = 0; i < numNodes; i++) {
int value;
cin >> value;
avlTree.root = avlTree.insert(avlTree.root, value);
}
// Inorder traversal of the AVL tree
cout << "Inorder traversal of the AVL tree: ";
avlTree.inorder(avlTree.root);
cout << endl;
return 0;
}