Skip to content

Commit 9ba2597

Browse files
committed
Kth Smallest Element in a BST - Iterative: Morris Traversal
1 parent aa4b9aa commit 9ba2597

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

src/main/java/io/dksifoua/leetcode/kthsmallestelementinabst/Solution.java

+27
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,31 @@ private void dfs(TreeNode node, int[] smallest) {
2222

2323
if (node.getRight() != null) dfs(node.getRight(), smallest);
2424
}
25+
26+
public int kthSmallestIterative(TreeNode root, int k) {
27+
TreeNode current = root;
28+
while (current != null) {
29+
if (current.getLeft() == null) {
30+
k -= 1;
31+
if (k == 0) return current.getValue();
32+
current = current.getRight();
33+
} else {
34+
TreeNode previous = current.getLeft();
35+
while (previous.getRight() != null && previous.getRight() != current) {
36+
previous = previous.getRight();
37+
}
38+
39+
if (previous.getRight() == null) {
40+
previous.setRight(current);
41+
current = current.getLeft();
42+
} else {
43+
k -= 1;
44+
if (k == 0) return current.getValue();
45+
current = current.getRight();
46+
}
47+
}
48+
}
49+
50+
throw new IllegalArgumentException("Not solvable!!");
51+
}
2552
}

src/test/java/io/dksifoua/leetcode/kthsmallestelementinabst/SolutionTest.java

+19-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import io.dksifoua.leetcode.utils.TreeNode;
44
import org.junit.jupiter.api.Test;
55

6-
import static org.junit.jupiter.api.Assertions.assertEquals;
6+
import static org.junit.jupiter.api.Assertions.*;
77

88
public class SolutionTest {
99

@@ -14,8 +14,26 @@ void test1() {
1414
assertEquals(1, solution.kthSmallest(TreeNode.build(new Integer[] { 3, 1, 4, null, 2 }), 1));
1515
}
1616

17+
@Test
18+
void test1Iterative() {
19+
assertEquals(1, solution.kthSmallestIterative(TreeNode.build(new Integer[] { 3, 1, 4, null, 2 }), 1));
20+
}
21+
1722
@Test
1823
void test2() {
1924
assertEquals(3, solution.kthSmallest(TreeNode.build(new Integer[] { 5, 3, 6, 2, 4, null, null, 1 }), 3));
2025
}
26+
27+
@Test
28+
void test2Iterative() {
29+
assertEquals(3, solution.kthSmallestIterative(TreeNode.build(new Integer[] { 5, 3, 6, 2, 4, null, null, 1 }), 3));
30+
}
31+
32+
@Test
33+
void test3Iterative() {
34+
Throwable exception = assertThrows(IllegalArgumentException.class, () -> {
35+
solution.kthSmallestIterative(TreeNode.build(new Integer[] { 5, 3, 6, 2, 4, null, null, 1 }), 7);
36+
});
37+
assertEquals("Not solvable!!", exception.getMessage());
38+
}
2139
}

0 commit comments

Comments
 (0)