Skip to content

Commit 81e7d81

Browse files
authored
Create program-optimized.c
1 parent 386f125 commit 81e7d81

File tree

1 file changed

+172
-0
lines changed

1 file changed

+172
-0
lines changed

AVL Tree/program-optimized.c

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
// AVL Tree node structure
5+
struct Node {
6+
int data;
7+
struct Node* left;
8+
struct Node* right;
9+
int height;
10+
};
11+
12+
// Get the height of a node
13+
int height(struct Node* node) {
14+
return (node == NULL) ? 0 : node->height;
15+
}
16+
17+
// Create a new node
18+
struct Node* createNode(int data) {
19+
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
20+
node->data = data;
21+
node->left = node->right = NULL;
22+
node->height = 1;
23+
return node;
24+
}
25+
26+
// Update the height of a node based on its children
27+
void updateHeight(struct Node* node) {
28+
node->height = 1 + ((height(node->left) > height(node->right)) ? height(node->left) : height(node->right));
29+
}
30+
31+
// Perform a right rotation
32+
struct Node* rightRotate(struct Node* y) {
33+
struct Node* x = y->left;
34+
y->left = x->right;
35+
x->right = y;
36+
updateHeight(y);
37+
updateHeight(x);
38+
return x;
39+
}
40+
41+
// Perform a left rotation
42+
struct Node* leftRotate(struct Node* x) {
43+
struct Node* y = x->right;
44+
x->right = y->left;
45+
y->left = x;
46+
updateHeight(x);
47+
updateHeight(y);
48+
return y;
49+
}
50+
51+
// Get the balance factor of a node
52+
int getBalance(struct Node* node) {
53+
return (node == NULL) ? 0 : height(node->left) - height(node->right);
54+
}
55+
56+
// Insert a node into the AVL tree
57+
struct Node* insertNode(struct Node* node, int data) {
58+
if (node == NULL) return createNode(data);
59+
60+
if (data < node->data)
61+
node->left = insertNode(node->left, data);
62+
else if (data > node->data)
63+
node->right = insertNode(node->right, data);
64+
else
65+
return node;
66+
67+
updateHeight(node);
68+
69+
int balance = getBalance(node);
70+
71+
if (balance > 1 && data < node->left->data)
72+
return rightRotate(node);
73+
if (balance < -1 && data > node->right->data)
74+
return leftRotate(node);
75+
if (balance > 1 && data > node->left->data) {
76+
node->left = leftRotate(node->left);
77+
return rightRotate(node);
78+
}
79+
if (balance < -1 && data < node->right->data) {
80+
node->right = rightRotate(node->right);
81+
return leftRotate(node);
82+
}
83+
84+
return node;
85+
}
86+
87+
// Find the node with the minimum value in an AVL tree
88+
struct Node* findMin(struct Node* node) {
89+
while (node->left != NULL) node = node->left;
90+
return node;
91+
}
92+
93+
// Delete a node from the AVL tree
94+
struct Node* deleteNode(struct Node* root, int data) {
95+
if (root == NULL) return NULL;
96+
97+
if (data < root->data)
98+
root->left = deleteNode(root->left, data);
99+
else if (data > root->data)
100+
root->right = deleteNode(root->right, data);
101+
else {
102+
if (root->left == NULL || root->right == NULL) {
103+
struct Node* temp = root->left ? root->left : root->right;
104+
free(root);
105+
return temp;
106+
}
107+
struct Node* temp = findMin(root->right);
108+
root->data = temp->data;
109+
root->right = deleteNode(root->right, temp->data);
110+
}
111+
112+
updateHeight(root);
113+
int balance = getBalance(root);
114+
115+
if (balance > 1 && getBalance(root->left) >= 0)
116+
return rightRotate(root);
117+
if (balance > 1 && getBalance(root->left) < 0) {
118+
root->left = leftRotate(root->left);
119+
return rightRotate(root);
120+
}
121+
if (balance < -1 && getBalance(root->right) <= 0)
122+
return leftRotate(root);
123+
if (balance < -1 && getBalance(root->right) > 0) {
124+
root->right = rightRotate(root->right);
125+
return leftRotate(root);
126+
}
127+
128+
return root;
129+
}
130+
131+
// Search for a node in the AVL tree
132+
int searchNode(struct Node* root, int data) {
133+
if (root == NULL) return 0;
134+
if (data == root->data) return 1;
135+
return (data < root->data) ? searchNode(root->left, data) : searchNode(root->right, data);
136+
}
137+
138+
// In-order traversal of the AVL tree
139+
void inorderTraversal(struct Node* root) {
140+
if (root) {
141+
inorderTraversal(root->left);
142+
printf("%d -> ", root->data);
143+
inorderTraversal(root->right);
144+
}
145+
}
146+
147+
int main() {
148+
struct Node* root = NULL;
149+
150+
root = insertNode(root, 10);
151+
root = insertNode(root, 20);
152+
root = insertNode(root, 30);
153+
root = insertNode(root, 40);
154+
root = insertNode(root, 50);
155+
root = insertNode(root, 25);
156+
157+
printf("In-order traversal after insertions:\n");
158+
inorderTraversal(root);
159+
printf("NULL\n");
160+
161+
// Deletion
162+
root = deleteNode(root, 20);
163+
printf("In-order traversal after deleting 20:\n");
164+
inorderTraversal(root);
165+
printf("NULL\n");
166+
167+
// Searching
168+
int searchKey = 25;
169+
printf("Node %d %s in the AVL tree.\n", searchKey, searchNode(root, searchKey) ? "found" : "not found");
170+
171+
return 0;
172+
}

0 commit comments

Comments
 (0)