Skip to content

Commit dfe4a28

Browse files
Refactor: fix missing height() method and improve AVL tree structure
1 parent 97c0377 commit dfe4a28

File tree

4 files changed

+102
-108
lines changed

4 files changed

+102
-108
lines changed

src/test/java/com/thealgorithms/tree/AVLtree/AVLDelete.java

Lines changed: 58 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,62 @@
11
package com.thealgorithms.tree.AVLtree;
22

3-
public class AVLDelete extends AVLInsert {
3+
public class AVLDelete {
44

5-
Node minValueNode(Node node) {
5+
static class Node {
6+
int key, height;
7+
Node left, right;
8+
9+
Node(int d) {
10+
key = d;
11+
height = 1;
12+
}
13+
}
14+
15+
private Node root;
16+
17+
private int height(Node n) {
18+
return (n == null) ? 0 : n.height;
19+
}
20+
21+
private int getBalance(Node n) {
22+
return (n == null) ? 0 : height(n.left) - height(n.right);
23+
}
24+
25+
private Node rightRotate(Node y) {
26+
Node x = y.left;
27+
Node T2 = x.right;
28+
29+
x.right = y;
30+
y.left = T2;
31+
32+
y.height = Math.max(height(y.left), height(y.right)) + 1;
33+
x.height = Math.max(height(x.left), height(x.right)) + 1;
34+
35+
return x;
36+
}
37+
38+
private Node leftRotate(Node x) {
39+
Node y = x.right;
40+
Node T2 = y.left;
41+
42+
y.left = x;
43+
x.right = T2;
44+
45+
x.height = Math.max(height(x.left), height(x.right)) + 1;
46+
y.height = Math.max(height(y.left), height(y.right)) + 1;
47+
48+
return y;
49+
}
50+
51+
private Node minValueNode(Node node) {
652
Node current = node;
753
while (current.left != null) {
854
current = current.left;
955
}
1056
return current;
1157
}
1258

13-
Node deleteNode(Node root, int key) {
59+
public Node deleteNode(Node root, int key) {
1460
if (root == null) {
1561
return root;
1662
}
@@ -20,9 +66,11 @@ Node deleteNode(Node root, int key) {
2066
} else if (key > root.key) {
2167
root.right = deleteNode(root.right, key);
2268
} else {
69+
// Node with only one child or no child
2370
if ((root.left == null) || (root.right == null)) {
2471
Node temp = (root.left != null) ? root.left : root.right;
2572
if (temp == null) {
73+
temp = root;
2674
root = null;
2775
} else {
2876
root = temp;
@@ -39,6 +87,7 @@ Node deleteNode(Node root, int key) {
3987
}
4088

4189
root.height = Math.max(height(root.left), height(root.right)) + 1;
90+
4291
int balance = getBalance(root);
4392

4493
// Left Left Case
@@ -66,24 +115,11 @@ Node deleteNode(Node root, int key) {
66115
return root;
67116
}
68117

69-
public static void main(String[] args) {
70-
AVLDelete tree = new AVLDelete();
71-
tree.root = tree.insert(tree.root, 9);
72-
tree.root = tree.insert(tree.root, 5);
73-
tree.root = tree.insert(tree.root, 10);
74-
tree.root = tree.insert(tree.root, 0);
75-
tree.root = tree.insert(tree.root, 6);
76-
tree.root = tree.insert(tree.root, 11);
77-
tree.root = tree.insert(tree.root, -1);
78-
tree.root = tree.insert(tree.root, 1);
79-
tree.root = tree.insert(tree.root, 2);
80-
81-
System.out.println("Preorder traversal before deletion:");
82-
tree.preOrder(tree.root);
83-
84-
tree.root = tree.deleteNode(tree.root, 10);
85-
86-
System.out.println("\nPreorder traversal after deletion:");
87-
tree.preOrder(tree.root);
118+
public Node getRoot() {
119+
return root;
120+
}
121+
122+
public void setRoot(Node root) {
123+
this.root = root;
88124
}
89125
}
Lines changed: 21 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,54 @@
11
package com.thealgorithms.tree.AVLtree;
22

3-
class Node {
4-
int key;
5-
int height;
6-
Node left;
7-
Node right;
8-
9-
Node(int d) {
10-
key = d;
11-
height = 1;
12-
}
13-
}
14-
153
public class AVLInsert {
164

17-
Node root;
5+
static class Node {
6+
int key, height;
7+
Node left, right;
188

19-
int height(Node node) {
20-
if (node == null) {
21-
return 0;
9+
Node(int key) {
10+
this.key = key;
11+
height = 1;
2212
}
23-
return node.height;
2413
}
2514

26-
int getBalance(Node node) {
27-
if (node == null) {
28-
return 0;
29-
}
30-
return height(node.left) - height(node.right);
15+
protected Node root;
16+
17+
protected int height(Node node) {
18+
return (node == null) ? 0 : node.height;
19+
}
20+
21+
protected int getBalance(Node node) {
22+
return (node == null) ? 0 : height(node.left) - height(node.right);
3123
}
3224

33-
Node rightRotate(Node y) {
25+
protected Node rightRotate(Node y) {
3426
Node x = y.left;
35-
Node t2 = x.right;
27+
Node T2 = x.right;
3628

37-
// Perform rotation
3829
x.right = y;
39-
y.left = t2;
30+
y.left = T2;
4031

41-
// Update heights
4232
y.height = Math.max(height(y.left), height(y.right)) + 1;
4333
x.height = Math.max(height(x.left), height(x.right)) + 1;
4434

45-
// Return new root
4635
return x;
4736
}
4837

49-
Node leftRotate(Node x) {
38+
protected Node leftRotate(Node x) {
5039
Node y = x.right;
51-
Node t2 = y.left;
40+
Node T2 = y.left;
5241

53-
// Perform rotation
5442
y.left = x;
55-
x.right = t2;
43+
x.right = T2;
5644

57-
// Update heights
5845
x.height = Math.max(height(x.left), height(x.right)) + 1;
5946
y.height = Math.max(height(y.left), height(y.right)) + 1;
6047

61-
// Return new root
6248
return y;
6349
}
6450

65-
Node insert(Node node, int key) {
51+
public Node insert(Node node, int key) {
6652
if (node == null) {
6753
return new Node(key);
6854
}
@@ -78,50 +64,24 @@ Node insert(Node node, int key) {
7864
node.height = 1 + Math.max(height(node.left), height(node.right));
7965
int balance = getBalance(node);
8066

81-
// Left Left Case
8267
if (balance > 1 && key < node.left.key) {
8368
return rightRotate(node);
8469
}
8570

86-
// Right Right Case
8771
if (balance < -1 && key > node.right.key) {
8872
return leftRotate(node);
8973
}
9074

91-
// Left Right Case
9275
if (balance > 1 && key > node.left.key) {
9376
node.left = leftRotate(node.left);
9477
return rightRotate(node);
9578
}
9679

97-
// Right Left Case
9880
if (balance < -1 && key < node.right.key) {
9981
node.right = rightRotate(node.right);
10082
return leftRotate(node);
10183
}
10284

10385
return node;
10486
}
105-
106-
void preOrder(Node node) {
107-
if (node != null) {
108-
System.out.print(node.key + " ");
109-
preOrder(node.left);
110-
preOrder(node.right);
111-
}
112-
}
113-
114-
public static void main(String[] args) {
115-
AVLInsert tree = new AVLInsert();
116-
117-
tree.root = tree.insert(tree.root, 10);
118-
tree.root = tree.insert(tree.root, 20);
119-
tree.root = tree.insert(tree.root, 30);
120-
tree.root = tree.insert(tree.root, 40);
121-
tree.root = tree.insert(tree.root, 50);
122-
tree.root = tree.insert(tree.root, 25);
123-
124-
System.out.println("Preorder traversal of constructed tree is:");
125-
tree.preOrder(tree.root);
126-
}
12787
}

src/test/java/com/thealgorithms/tree/AVLtree/CheckBalance.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
public class CheckBalance extends AVLInsert {
44

5-
boolean isBalanced(Node node) {
5+
public boolean isBalanced(Node node) {
66
if (node == null) {
77
return true;
88
}
@@ -14,20 +14,4 @@ boolean isBalanced(Node node) {
1414

1515
return isBalanced(node.left) && isBalanced(node.right);
1616
}
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-
tree.root = tree.insert(tree.root, 40);
24-
tree.root = tree.insert(tree.root, 50);
25-
tree.root = tree.insert(tree.root, 25);
26-
27-
System.out.println("Is AVL Tree balanced? " + tree.isBalanced(tree.root));
28-
29-
// Manually unbalance it
30-
tree.root.left.left = new Node(5);
31-
System.out.println("Is AVL Tree balanced after modification? " + tree.isBalanced(tree.root));
32-
}
3317
}

src/test/java/com/thealgorithms/tree/AVLtree/Rotations.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,29 @@
22

33
public class Rotations extends AVLInsert {
44

5-
public static void main(String[] args) {
6-
Rotations tree = new Rotations();
7-
tree.root = tree.insert(tree.root, 30);
8-
tree.root = tree.insert(tree.root, 20);
9-
tree.root = tree.insert(tree.root, 10);
5+
public Node rightRotate(Node y) {
6+
Node x = y.left;
7+
Node T2 = x.right;
108

11-
System.out.println("Performing right rotation...");
12-
tree.root = tree.rightRotate(tree.root);
9+
x.right = y;
10+
y.left = T2;
1311

14-
System.out.println("New root after rotation: " + tree.root.key);
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+
15+
return x;
16+
}
17+
18+
public Node leftRotate(Node x) {
19+
Node y = x.right;
20+
Node T2 = y.left;
21+
22+
y.left = x;
23+
x.right = T2;
24+
25+
x.height = Math.max(height(x.left), height(x.right)) + 1;
26+
y.height = Math.max(height(y.left), height(y.right)) + 1;
27+
28+
return y;
1529
}
1630
}

0 commit comments

Comments
 (0)