Skip to content

Commit a85e51e

Browse files
Add AVL Tree module with insert, delete, and balance check implementations
1 parent 55da3b9 commit a85e51e

File tree

4 files changed

+255
-0
lines changed

4 files changed

+255
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.thealgorithms.tree.AVLtree;
2+
3+
4+
5+
public class AVLDelete extends AVLInsert {
6+
7+
Node minValueNode(Node node) {
8+
Node current = node;
9+
while (current.left != null)
10+
current = current.left;
11+
return current;
12+
}
13+
14+
Node deleteNode(Node root, int key) {
15+
if (root == null)
16+
return root;
17+
18+
if (key < root.key)
19+
root.left = deleteNode(root.left, key);
20+
else if (key > root.key)
21+
root.right = deleteNode(root.right, key);
22+
else {
23+
if ((root.left == null) || (root.right == null)) {
24+
Node temp = null;
25+
if (root.left != null)
26+
temp = root.left;
27+
else
28+
temp = root.right;
29+
30+
if (temp == null) {
31+
root = null;
32+
} else {
33+
root = temp;
34+
}
35+
} else {
36+
Node temp = minValueNode(root.right);
37+
root.key = temp.key;
38+
root.right = deleteNode(root.right, temp.key);
39+
}
40+
}
41+
42+
if (root == null)
43+
return root;
44+
45+
root.height = Math.max(height(root.left), height(root.right)) + 1;
46+
int balance = getBalance(root);
47+
48+
if (balance > 1 && getBalance(root.left) >= 0)
49+
return rightRotate(root);
50+
51+
if (balance > 1 && getBalance(root.left) < 0) {
52+
root.left = leftRotate(root.left);
53+
return rightRotate(root);
54+
}
55+
56+
if (balance < -1 && getBalance(root.right) <= 0)
57+
return leftRotate(root);
58+
59+
if (balance < -1 && getBalance(root.right) > 0) {
60+
root.right = rightRotate(root.right);
61+
return leftRotate(root);
62+
}
63+
64+
return root;
65+
}
66+
67+
public static void main(String[] args) {
68+
AVLDelete tree = new AVLDelete();
69+
tree.root = tree.insert(tree.root, 9);
70+
tree.root = tree.insert(tree.root, 5);
71+
tree.root = tree.insert(tree.root, 10);
72+
tree.root = tree.insert(tree.root, 0);
73+
tree.root = tree.insert(tree.root, 6);
74+
tree.root = tree.insert(tree.root, 11);
75+
tree.root = tree.insert(tree.root, -1);
76+
tree.root = tree.insert(tree.root, 1);
77+
tree.root = tree.insert(tree.root, 2);
78+
79+
System.out.println("Preorder before deletion:");
80+
tree.preOrder(tree.root);
81+
82+
tree.root = tree.deleteNode(tree.root, 10);
83+
84+
System.out.println("\nPreorder after deletion:");
85+
tree.preOrder(tree.root);
86+
}
87+
}
88+
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package com.thealgorithms.tree.AVLtree;
2+
3+
class Node {
4+
int key, height;
5+
Node left, right;
6+
7+
Node(int d) {
8+
key = d;
9+
height = 1;
10+
}
11+
}
12+
13+
public class AVLInsert {
14+
15+
Node root;
16+
17+
int height(Node n) {
18+
return n == null ? 0 : n.height;
19+
}
20+
21+
int getBalance(Node n) {
22+
return n == null ? 0 : height(n.left) - height(n.right);
23+
}
24+
25+
Node rightRotate(Node y) {
26+
Node x = y.left;
27+
Node T2 = x.right;
28+
x.right = y;
29+
y.left = T2;
30+
y.height = Math.max(height(y.left), height(y.right)) + 1;
31+
x.height = Math.max(height(x.left), height(x.right)) + 1;
32+
return x;
33+
}
34+
35+
Node leftRotate(Node x) {
36+
Node y = x.right;
37+
Node T2 = y.left;
38+
y.left = x;
39+
x.right = T2;
40+
x.height = Math.max(height(x.left), height(x.right)) + 1;
41+
y.height = Math.max(height(y.left), height(y.right)) + 1;
42+
return y;
43+
}
44+
45+
Node insert(Node node, int key) {
46+
if (node == null)
47+
return new Node(key);
48+
49+
if (key < node.key)
50+
node.left = insert(node.left, key);
51+
else if (key > node.key)
52+
node.right = insert(node.right, key);
53+
else
54+
return node;
55+
56+
node.height = 1 + Math.max(height(node.left), height(node.right));
57+
int balance = getBalance(node);
58+
59+
if (balance > 1 && key < node.left.key)
60+
return rightRotate(node);
61+
62+
if (balance < -1 && key > node.right.key)
63+
return leftRotate(node);
64+
65+
if (balance > 1 && key > node.left.key) {
66+
node.left = leftRotate(node.left);
67+
return rightRotate(node);
68+
}
69+
70+
if (balance < -1 && key < node.right.key) {
71+
node.right = rightRotate(node.right);
72+
return leftRotate(node);
73+
}
74+
75+
return node;
76+
}
77+
78+
void preOrder(Node node) {
79+
if (node != null) {
80+
System.out.print(node.key + " ");
81+
preOrder(node.left);
82+
preOrder(node.right);
83+
}
84+
}
85+
86+
public static void main(String[] args) {
87+
AVLInsert tree = new AVLInsert();
88+
89+
tree.root = tree.insert(tree.root, 10);
90+
tree.root = tree.insert(tree.root, 20);
91+
tree.root = tree.insert(tree.root, 30);
92+
tree.root = tree.insert(tree.root, 40);
93+
tree.root = tree.insert(tree.root, 50);
94+
tree.root = tree.insert(tree.root, 25);
95+
96+
System.out.println("Preorder traversal of AVL tree:");
97+
tree.preOrder(tree.root);
98+
}
99+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.thealgorithms.tree.AVLtree;
2+
3+
4+
5+
public class CheckBalance extends AVLInsert {
6+
7+
boolean isBalanced(Node node) {
8+
if (node == null)
9+
return true;
10+
11+
int balance = getBalance(node);
12+
if (Math.abs(balance) > 1)
13+
return false;
14+
15+
return isBalanced(node.left) && isBalanced(node.right);
16+
}
17+
18+
public static void main(String[] args) {
19+
CheckBalance tree = new CheckBalance();
20+
tree.root = tree.insert(tree.root, 10);
21+
tree.root = tree.insert(tree.root, 20);
22+
tree.root = tree.insert(tree.root, 30);
23+
24+
System.out.println("Is AVL Tree balanced? " + tree.isBalanced(tree.root));
25+
26+
tree.root.left.left = new Node(5); // Manually unbalance it
27+
System.out.println("Is AVL Tree balanced after modification? " + tree.isBalanced(tree.root));
28+
}
29+
}
30+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.thealgorithms.tree.AVLtree;
2+
3+
4+
5+
public class Rotations extends AVLInsert {
6+
7+
public Node rightRotate(Node y) {
8+
Node x = y.left;
9+
Node T2 = x.right;
10+
x.right = y;
11+
y.left = T2;
12+
y.height = Math.max(height(y.left), height(y.right)) + 1;
13+
x.height = Math.max(height(x.left), height(x.right)) + 1;
14+
return x;
15+
}
16+
17+
public Node leftRotate(Node x) {
18+
Node y = x.right;
19+
Node T2 = y.left;
20+
y.left = x;
21+
x.right = T2;
22+
x.height = Math.max(height(x.left), height(x.right)) + 1;
23+
y.height = Math.max(height(y.left), height(y.right)) + 1;
24+
return y;
25+
}
26+
27+
public static void main(String[] args) {
28+
Rotations r = new Rotations();
29+
Node root = new Node(30);
30+
root.left = new Node(20);
31+
root.left.left = new Node(10);
32+
33+
System.out.println("Performing right rotation on 30...");
34+
root = r.rightRotate(root);
35+
System.out.println("New root after rotation: " + root.key);
36+
}
37+
}
38+

0 commit comments

Comments
 (0)