-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAVLTree.java
More file actions
180 lines (145 loc) · 5.44 KB
/
Copy pathAVLTree.java
File metadata and controls
180 lines (145 loc) · 5.44 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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
public class AVLTree {
class Node {
int value, height;
Node left, right;
Node(int value) {
this.value = value;
height = 1;
left = right = null;
}
}
Node root;
void inOrderTraverse(Node root) {
if (root == null) return;
inOrderTraverse(root.left);
System.out.print(root.value+", ");
inOrderTraverse(root.right);
}
int getHeight(Node node) {
if (node == null) return 0;
return node.height;
}
int maxVal(int a, int b) {
return a > b ? a : b;
}
int getBalance(Node node) {
if (node == null) return 0;
return getHeight(node.left) - getHeight(node.right);
}
Node leftRotate(Node node) {
Node t1 = node.right;
Node t2 = t1.left;
t1.left = node;
node.right = t2;
node.height = maxVal(getHeight(node.left), getHeight(node.right))+1;
t1.height = maxVal(getHeight(t1.left), getHeight(t1.right))+1;
return t1;
}
Node rightRotate(Node node) {
Node t1 = node.left;
Node t2 = t1.right;
t1.right = node;
node.left = t2;
node.height = maxVal(getHeight(node.left), getHeight(node.right))+1;
t1.height = maxVal(getHeight(t1.left), getHeight(t1.right))+1;
return t1;
}
Node insertNode(Node node, Integer val) {
if (node == null)
return new Node(val);
// 1. Perform BST Insert
if (val < node.value)
node.left = insertNode(node.left, val);
else if (val > node.value)
node.right = insertNode(node.right, val);
else // duplicate values not allowed
return node;
// 2. Update height of node
node.height = maxVal(getHeight(node.left), getHeight(node.right))+1;
// 3. check balance of the nodee);
int bal = getBalance(node);
// 4. if un-balance
// left left case
if (bal > 1 && val < node.left.value)
return rightRotate(node);
// right right case
else if (bal < -1 && val > node.right.value)
return leftRotate(node);
// left right case
else if (bal > 1 && val > node.left.value) {
node.left = leftRotate(node.left);
return rightRotate(node);
} // right left case
else if (bal < -1 && val < node.right.value) {
node.right = rightRotate(node.right);
return leftRotate(node);
}
// 5. no un-balance
return node;
}
Node maxValueNode(Node node) {
Node curr = node;
while (curr.right != null) curr = curr.right;
return curr;
}
Node deleteNode(Node node, int val) {
// 1. Perform standard BST delete
if (node == null)
return node;
if (val < node.value) // node to be deleted lies in left subtree
node.left = deleteNode(node.left, val);
else if (val > node.value) // node to be deleted lies in right subtree
node.right = deleteNode(node.right, val);
else { // this is the node to be deleted
// if node has only 0 or 1 child
if (node.left == null || node.right == null) {
Node temp = null;
if (node.left == null) temp = node.right;
else temp = node.right;
node = temp;
} // node has both child, replace with smallest predecessor
else {
Node temp = maxValueNode(node.left);
node.value = temp.value;
node.left = deleteNode(temp, val);
}
}
// if tree has only one node, return
if (node == null) return node;
// 2. Update height of current node
node.height = maxVal(getHeight(node.left), getHeight(node.right))+1;
// 3. Get balance factor of the node
int bal = getBalance(node);
// if unbalanced, there are 4 cases
if (bal > 1 && val < node.left.value) // left-left case
return rightRotate(node);
else if (bal < -1 && val > node.right.value) // right-right case
return leftRotate(node);
else if (bal > 1 && val > node.left.value) { // left-right case
node.left = leftRotate(node.left);
return rightRotate(node);
} else if (bal < -1 && val < node.right.value) { // right-left case
node.right = rightRotate(node.right);
return leftRotate(node);
}
// not unbalanced
return node;
}
public static void main(String[] args) {
AVLTree avlTree = new AVLTree();
avlTree.root = avlTree.insertNode(null, 1);
avlTree.root = avlTree.insertNode(avlTree.root, 2);
avlTree.root = avlTree.insertNode(avlTree.root, 3);
avlTree.root = avlTree.insertNode(avlTree.root, 4);
avlTree.root = avlTree.insertNode(avlTree.root, 5);
avlTree.root = avlTree.insertNode(avlTree.root, 6);
avlTree.root = avlTree.insertNode(avlTree.root, 7);
avlTree.root = avlTree.insertNode(avlTree.root, 8);
avlTree.root = avlTree.insertNode(avlTree.root, 9);
avlTree.root = avlTree.insertNode(avlTree.root, 10);
avlTree.inOrderTraverse(avlTree.root);
System.out.println();
avlTree.root = avlTree.deleteNode(avlTree.root, 3);
avlTree.inOrderTraverse(avlTree.root);
}
}