Skip to content

Commit e6439e5

Browse files
authored
Create AVL Tree.java
AVL tree implementation in Java
1 parent b0225b7 commit e6439e5

File tree

1 file changed

+189
-0
lines changed

1 file changed

+189
-0
lines changed

Diff for: AVL Tree.java

+189
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
class Node {
2+
int item, height;
3+
Node left, right;
4+
5+
Node(int d) {
6+
item = d;
7+
height = 1;
8+
}
9+
}
10+
11+
// Tree class
12+
class AVLTree {
13+
Node root;
14+
15+
int height(Node N) {
16+
if (N == null)
17+
return 0;
18+
return N.height;
19+
}
20+
21+
int max(int a, int b) {
22+
return (a > b) ? a : b;
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 = max(height(y.left), height(y.right)) + 1;
31+
x.height = 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 = max(height(x.left), height(x.right)) + 1;
41+
y.height = max(height(y.left), height(y.right)) + 1;
42+
return y;
43+
}
44+
45+
// Get balance factor of a node
46+
int getBalanceFactor(Node N) {
47+
if (N == null)
48+
return 0;
49+
return height(N.left) - height(N.right);
50+
}
51+
52+
// Insert a node
53+
Node insertNode(Node node, int item) {
54+
55+
// Find the position and insert the node
56+
if (node == null)
57+
return (new Node(item));
58+
if (item < node.item)
59+
node.left = insertNode(node.left, item);
60+
else if (item > node.item)
61+
node.right = insertNode(node.right, item);
62+
else
63+
return node;
64+
65+
// Update the balance factor of each node
66+
// And, balance the tree
67+
node.height = 1 + max(height(node.left), height(node.right));
68+
int balanceFactor = getBalanceFactor(node);
69+
if (balanceFactor > 1) {
70+
if (item < node.left.item) {
71+
return rightRotate(node);
72+
} else if (item > node.left.item) {
73+
node.left = leftRotate(node.left);
74+
return rightRotate(node);
75+
}
76+
}
77+
if (balanceFactor < -1) {
78+
if (item > node.right.item) {
79+
return leftRotate(node);
80+
} else if (item < node.right.item) {
81+
node.left = rightRotate(node.left);
82+
return leftRotate(node);
83+
}
84+
}
85+
return node;
86+
}
87+
88+
Node nodeWithMimumValue(Node node) {
89+
Node current = node;
90+
while (current.left != null)
91+
current = current.left;
92+
return current;
93+
}
94+
95+
// Delete a node
96+
Node deleteNode(Node root, int item) {
97+
98+
// Find the node to be deleted and remove it
99+
if (root == null)
100+
return root;
101+
if (item < root.item)
102+
root.left = deleteNode(root.left, item);
103+
else if (item > root.item)
104+
root.right = deleteNode(root.right, item);
105+
else {
106+
if ((root.left == null) || (root.right == null)) {
107+
Node temp = null;
108+
if (temp == root.left)
109+
temp = root.right;
110+
else
111+
temp = root.left;
112+
if (temp == null) {
113+
temp = root;
114+
root = null;
115+
} else
116+
root = temp;
117+
} else {
118+
Node temp = nodeWithMimumValue(root.right);
119+
root.item = temp.item;
120+
root.right = deleteNode(root.right, temp.item);
121+
}
122+
}
123+
if (root == null)
124+
return root;
125+
126+
// Update the balance factor of each node and balance the tree
127+
root.height = max(height(root.left), height(root.right)) + 1;
128+
int balanceFactor = getBalanceFactor(root);
129+
if (balanceFactor > 1) {
130+
if (getBalanceFactor(root.left) >= 0) {
131+
return rightRotate(root);
132+
} else {
133+
root.left = leftRotate(root.left);
134+
return rightRotate(root);
135+
}
136+
}
137+
if (balanceFactor < -1) {
138+
if (getBalanceFactor(root.right) <= 0) {
139+
return leftRotate(root);
140+
} else {
141+
root.right = rightRotate(root.right);
142+
return leftRotate(root);
143+
}
144+
}
145+
return root;
146+
}
147+
148+
void preOrder(Node node) {
149+
if (node != null) {
150+
System.out.print(node.item + " ");
151+
preOrder(node.left);
152+
preOrder(node.right);
153+
}
154+
}
155+
156+
// Print the tree
157+
private void printTree(Node currPtr, String indent, boolean last) {
158+
if (currPtr != null) {
159+
System.out.print(indent);
160+
if (last) {
161+
System.out.print("R----");
162+
indent += " ";
163+
} else {
164+
System.out.print("L----");
165+
indent += "| ";
166+
}
167+
System.out.println(currPtr.item);
168+
printTree(currPtr.left, indent, false);
169+
printTree(currPtr.right, indent, true);
170+
}
171+
}
172+
173+
// Driver code
174+
public static void main(String[] args) {
175+
AVLTree tree = new AVLTree();
176+
tree.root = tree.insertNode(tree.root, 33);
177+
tree.root = tree.insertNode(tree.root, 13);
178+
tree.root = tree.insertNode(tree.root, 53);
179+
tree.root = tree.insertNode(tree.root, 9);
180+
tree.root = tree.insertNode(tree.root, 21);
181+
tree.root = tree.insertNode(tree.root, 61);
182+
tree.root = tree.insertNode(tree.root, 8);
183+
tree.root = tree.insertNode(tree.root, 11);
184+
tree.printTree(tree.root, "", true);
185+
tree.root = tree.deleteNode(tree.root, 13);
186+
System.out.println("After Deletion: ");
187+
tree.printTree(tree.root, "", true);
188+
}
189+
}

0 commit comments

Comments
 (0)