Skip to content

Commit 048fa5b

Browse files
committed
AVL tree is now genrric
1 parent 1945cee commit 048fa5b

File tree

3 files changed

+118
-61
lines changed

3 files changed

+118
-61
lines changed

build/classes/Trees/AVL.class

2.64 KB
Binary file not shown.

build/classes/Trees/Main.class

227 Bytes
Binary file not shown.

src/Trees/AVL.java

Lines changed: 118 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,67 @@
11
package Trees;
22

33
import java.util.*;
4+
import static Trees.BTree.TreeNode;
45

5-
public class AVL {
6+
public class AVL<T extends Comparable<T>> extends BinarySearchTree<T> {
67

7-
private class AVLNode {
8+
// heights of nodes are stored
9+
Map<TreeNode<T>, Integer> map;
810

9-
int val;
10-
int height;
11-
AVLNode left, right;
12-
13-
public AVLNode(int val) {
14-
this.val = val;
15-
this.height = 1;
16-
}
11+
private TreeNode<T> root;
1712

13+
public AVL() {
14+
map = new HashMap<>();
1815
}
19-
private AVLNode root;
2016

21-
public void add(int val) {
17+
@Override
18+
public void add(T val) {
2219
root = add(val, root);
2320
}
2421

25-
private int getHeight(AVLNode node) {
26-
return node == null ? 0 : node.height;
22+
private int getHeight(TreeNode node) {
23+
return map.getOrDefault(node, 0);
2724
}
2825

29-
private int getBalanceFactor(AVLNode node) {
26+
private int getBalanceFactor(TreeNode node) {
3027
if (node == null) {
3128
return 0;
3229
}
3330
return getHeight(node.left) - getHeight(node.right);
3431
}
3532

36-
private AVLNode add(int val, AVLNode root) {
37-
if (root == null) {
38-
return new AVLNode(val);
39-
} else if (root.val > val) {
40-
root.left = add(val, root.left);
41-
} else if (root.val < val) {
42-
root.right = add(val, root.right);
43-
} else {
44-
return root;
45-
}
46-
return balance(root, val);
47-
}
48-
49-
public void remove(int val) {
33+
@Override
34+
public void remove(T val) {
5035
root = delete(val, root);
5136
}
5237

53-
private int getMin(AVLNode node) {
38+
private T getMin(TreeNode<T> node) {
5439
if (node.left == null) {
5540
return node.val;
5641
}
57-
return getMin(node.left);
42+
return (T) getMin(node.left);
5843
}
5944

60-
public int getMin() {
45+
@Override
46+
public T getMin() {
6147
return getMin(root);
6248
}
6349

64-
private AVLNode delete(int val, AVLNode node) {
50+
private TreeNode<T> delete(T val, TreeNode<T> node) {
6551
if (node == null) {
6652
return null;
6753
}
68-
if (node.val > val) {
54+
if (node.val.compareTo(val) > 0) {
6955
node.left = delete(val, node.left);
70-
} else if (node.val < val) {
56+
} else if (node.val.compareTo(val) < 0) {
7157
node.right = delete(val, node.right);
7258
} else {
7359
if (node.left == null && node.right != null) {
7460
return node.right;
7561
} else if (node.left != null && node.right == null) {
7662
return node.left;
7763
} else if (node.left != null && node.right != null) {
78-
int min = getMin(node.right);
64+
T min = (T) getMin(node.right);
7965
node.val = min;
8066
node.right = delete(min, node.right);
8167
return node;
@@ -86,61 +72,132 @@ private AVLNode delete(int val, AVLNode node) {
8672
return balance(node, val);
8773
}
8874

89-
private AVLNode balance(AVLNode node, int val) {
90-
node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right));
75+
private TreeNode<T> add(T val, TreeNode< T> root) {
76+
if (root == null) {
77+
TreeNode<T> temp = new TreeNode(val);
78+
map.put(temp, 1);
79+
return temp;
80+
} else if (root.compareTo(val) > 0) {
81+
root.left = add(val, root.left);
82+
} else if (root.compareTo(val) < 0) {
83+
root.right = add(val, root.right);
84+
} else {
85+
return root;
86+
}
87+
return balance(root, val);
88+
}
89+
90+
private TreeNode<T> balance(TreeNode<T> node, T val) {
91+
map.put(node, 1 + Math.max(getHeight(node.left), getHeight(node.right)));
9192
int balanceFactor = getBalanceFactor(node);
9293
if (balanceFactor > 1) {
93-
if (val < node.left.val) {
94+
if (node.compareTo(val) > 0) {
9495
return rightRotate(node);
95-
} else if (val > node.left.val) {
96+
} else if (node.compareTo(val) < 0) {
9697
node.left = leftRotate(node.left);
9798
return rightRotate(node);
9899
}
99100
}
100101
if (balanceFactor < -1) {
101-
if (val > node.right.val) {
102+
if (node.compareTo(val) < 0) {
102103
return leftRotate(node);
103-
} else if (val < node.right.val) {
104+
} else if (node.compareTo(val) > 0) {
104105
node.right = rightRotate(node.right);
105106
return leftRotate(node);
106107
}
107108
}
108109
return node;
109110
}
110111

111-
private AVLNode leftRotate(AVLNode node) {
112-
AVLNode temp = node.right;
113-
AVLNode x = temp.left;
112+
private TreeNode<T> leftRotate(TreeNode<T> node) {
113+
TreeNode<T> temp = node.right;
114+
TreeNode<T> x = temp.left;
114115
temp.left = node;
115116
node.right = x;
116-
temp.height = 1 + Math.max(getHeight(temp.left), getHeight(temp.right));
117-
node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right));
117+
map.put(temp, 1 + Math.max(getHeight(temp.left), getHeight(temp.right)));
118+
map.put(node, 1 + Math.max(getHeight(node.left), getHeight(node.right)));
118119
return temp;
119120
}
120121

121-
private AVLNode rightRotate(AVLNode node) {
122-
AVLNode temp = node.left;
123-
AVLNode y = temp.right;
122+
private TreeNode<T> rightRotate(TreeNode<T> node) {
123+
TreeNode<T> temp = node.left;
124+
TreeNode<T> y = temp.right;
124125
temp.right = node;
125126
node.left = y;
126-
temp.height = 1 + Math.max(getHeight(temp.left), getHeight(temp.right));
127-
node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right));
127+
map.put(temp, 1 + Math.max(getHeight(temp.left), getHeight(temp.right)));
128+
map.put(node, 1 + Math.max(getHeight(node.left), getHeight(node.right)));
128129
return temp;
129130
}
130131

131-
public List<Object> inOrder() {
132-
return inOrder(root);
132+
@Override
133+
public boolean contains(T val) {
134+
return contains(val, root);
133135
}
134136

135-
private List<Object> inOrder(AVLNode node) {
137+
private boolean contains(T val, TreeNode node) {
136138
if (node == null) {
137-
return new ArrayList<>();
139+
return false;
138140
}
139-
List<Object> ans = new ArrayList<>();
140-
ans.addAll(inOrder(node.left));
141-
ans.add(node.val);
142-
ans.addAll(inOrder(node.right));
143-
return ans;
141+
if (node.compareTo(val) == 0) {
142+
return true;
143+
}
144+
return contains(val, node.left) || contains(val, node.right);
145+
}
146+
147+
@Override
148+
public List<Object> inOrder() {
149+
return super.inOrder(root);
150+
}
151+
152+
@Override
153+
public List<Object> preOrder() {
154+
return super.preOrder(root);
155+
}
156+
157+
@Override
158+
public List<Object> postOrder() {
159+
return super.postOrder(root);
160+
}
161+
162+
@Override
163+
public List<List<Object>> levelOrder() {
164+
return super.levelOrder(root);
165+
}
166+
167+
@Override
168+
public List<Object> leftView() {
169+
return super.leftView(root);
170+
}
171+
172+
@Override
173+
public List<Object> rightView() {
174+
return super.rightView(root);
175+
}
176+
177+
@Override
178+
public List<Object> topView() {
179+
return super.topView(root);
180+
}
181+
182+
@Override
183+
public List<Object> botttomView() {
184+
return super.botttomView(root);
185+
}
186+
187+
@Override
188+
public int height() {
189+
return super.height(root);
190+
}
191+
192+
@Override
193+
public int size() {
194+
return map.size();
195+
}
196+
197+
@Override
198+
public void clear() {
199+
root = null;
200+
map.clear();
144201
}
145202

146203
@Override

0 commit comments

Comments
 (0)