Skip to content

Commit 7eecdc7

Browse files
committed
Implement Wavelet Tree with rank and kthSmallest methods
1 parent 3ea09f2 commit 7eecdc7

2 files changed

Lines changed: 19 additions & 16 deletions

File tree

src/main/java/com/thealgorithms/datastructures/trees/WaveletTree.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ private class Node {
2626
this.low = low;
2727
this.high = high;
2828

29-
if (arr.length == 0 || low == high) {
29+
if (low == high) {
3030
return;
3131
}
3232

@@ -150,24 +150,15 @@ public int select(int x, int k) {
150150
}
151151

152152
private int select(Node node, int x, int k) {
153-
if (node == null) {
154-
return -1;
155-
}
156153
if (node.low == node.high) {
157154
return k - 1; // 0-based index within the imaginary array at the leaf
158155
}
159156
int mid = node.low + (node.high - node.low) / 2;
160157
if (x <= mid) {
161158
int posInLeft = select(node.left, x, k);
162-
if (posInLeft == -1) {
163-
return -1;
164-
}
165159
return binarySearchLeft(node.leftCount, posInLeft + 1);
166160
} else {
167161
int posInRight = select(node.right, x, k);
168-
if (posInRight == -1) {
169-
return -1;
170-
}
171162
return binarySearchRight(node.leftCount, posInRight + 1);
172163
}
173164
}
@@ -219,9 +210,6 @@ public int kthSmallest(int left, int right, int k) {
219210
}
220211

221212
private int kthSmallest(Node node, int left, int right, int k) {
222-
if (node == null) {
223-
return -1;
224-
}
225213
if (node.low == node.high) {
226214
return node.low;
227215
}

src/test/java/com/thealgorithms/datastructures/trees/WaveletTreeTest.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,27 +69,42 @@ public void testKthSmallest() {
6969

7070
@Test
7171
public void testEmptyAndSingleElementArray() {
72-
WaveletTree wtEmpty = new WaveletTree(new int[]{});
72+
WaveletTree wtEmpty = new WaveletTree(new int[] {});
7373
assertEquals(0, wtEmpty.rank(1, 0));
7474
assertEquals(-1, wtEmpty.select(1, 1));
7575
assertEquals(-1, wtEmpty.kthSmallest(0, 0, 1));
7676

77-
WaveletTree wtSingle = new WaveletTree(new int[]{42});
77+
WaveletTree wtSingle = new WaveletTree(new int[] {42});
7878
assertEquals(1, wtSingle.rank(42, 0));
7979
assertEquals(0, wtSingle.rank(42, -1));
8080
assertEquals(0, wtSingle.select(42, 1));
8181
assertEquals(-1, wtSingle.select(42, 2));
8282
assertEquals(42, wtSingle.kthSmallest(0, 0, 1));
8383
}
8484

85+
@Test
86+
public void testNullArrayAndCustomBounds() {
87+
WaveletTree wtNull = new WaveletTree(null);
88+
assertEquals(0, wtNull.rank(1, 0));
89+
90+
WaveletTree wtNullCustom = new WaveletTree(null, 1, 5);
91+
assertEquals(-1, wtNullCustom.select(1, 1));
92+
93+
int[] arr = {5, 1, 2, 5, 1};
94+
WaveletTree wtCustom = new WaveletTree(arr, 1, 10);
95+
assertEquals(2, wtCustom.rank(5, 4));
96+
assertEquals(0, wtCustom.rank(4, 4)); // Query an element inside bounds but not in array
97+
assertEquals(0, wtCustom.rank(10, 4)); // Query upper bound
98+
}
99+
85100
@Test
86101
public void testNegativeValues() {
87102
int[] arr = {-5, 10, -2, 0, -5};
88103
WaveletTree wt = new WaveletTree(arr);
89104

90105
assertEquals(2, wt.rank(-5, 4));
91106
assertEquals(1, wt.rank(0, 3));
92-
107+
93108
assertEquals(0, wt.select(-5, 1));
94109
assertEquals(4, wt.select(-5, 2));
95110
assertEquals(3, wt.select(0, 1));

0 commit comments

Comments
 (0)