Skip to content

Commit e4ee9db

Browse files
committed
Resolve "Sum of Root To Leaf Binary Numbers" problem
1 parent d817bfa commit e4ee9db

4 files changed

Lines changed: 105 additions & 39 deletions

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.github.dkoval.leetcode.challenge;
2+
3+
import com.github.dkoval.leetcode.TreeNode;
4+
5+
/**
6+
* <a href="https://leetcode.com/problems/sum-of-root-to-leaf-binary-numbers/">Sum of Root To Leaf Binary Numbers</a>
7+
* <p>
8+
* You are given the root of a binary tree where each node has a value 0 or 1.
9+
* Each root-to-leaf path represents a binary number starting with the most significant bit.
10+
* <p>
11+
* For example, if the path is 0 -> 1 -> 1 -> 0 -> 1, then this could represent 01101 in binary, which is 13.
12+
* <p>
13+
* For all leaves in the tree, consider the numbers represented by the path from the root to that leaf. Return the sum of these numbers.
14+
* <p>
15+
* The test cases are generated so that the answer fits in a 32-bits integer.
16+
* <p>
17+
* Constraints:
18+
* <ul>
19+
* <li>The number of nodes in the tree is in the range [1, 1000].</li>
20+
* <li>Node.val is 0 or 1.</li>
21+
* </ul>
22+
*/
23+
public interface SumOfRootToLeafBinaryNumbers {
24+
25+
int sumRootToLeaf(TreeNode root);
26+
27+
class SumOfRootToLeafBinaryNumbersRev2 implements SumOfRootToLeafBinaryNumbersRev1 {
28+
29+
@Override
30+
public int sumRootToLeaf(TreeNode root) {
31+
return traverse(root, 0);
32+
}
33+
34+
private int traverse(TreeNode node, int x) {
35+
if (node == null) {
36+
return 0;
37+
}
38+
39+
x *= 2;
40+
x += node.val;
41+
42+
if (node.left == null && node.right == null) {
43+
return x;
44+
}
45+
46+
return traverse(node.left, x) + traverse(node.right, x);
47+
}
48+
}
49+
}

src/main/kotlin/com/github/dkoval/leetcode/challenge/SumOfRootToLeafBinaryNumbers.kt

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.github.dkoval.leetcode.challenge
2+
3+
import com.github.dkoval.leetcode.TreeNode
4+
5+
object SumOfRootToLeafBinaryNumbersRev1 : SumOfRootToLeafBinaryNumbers {
6+
7+
// O(N) time | O(N) space
8+
override fun sumRootToLeaf(root: TreeNode?): Int = doSumRootToLeaf(root, 0)
9+
10+
private fun doSumRootToLeaf(root: TreeNode?, num: Int): Int {
11+
if (root == null) return 0
12+
val updatedNum = num * 2 + root.`val` // base2 to base10 conversion
13+
if (root.left == null && root.right == null) {
14+
// reached a leaf node
15+
return updatedNum
16+
}
17+
return doSumRootToLeaf(root.left, updatedNum) + doSumRootToLeaf(root.right, updatedNum)
18+
}
19+
}

src/test/kotlin/com/github/dkoval/leetcode/challenge/SumOfRootToLeafBinaryNumbersTest.kt

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
package com.github.dkoval.leetcode.challenge
22

33
import com.github.dkoval.leetcode.TreeNode
4+
import com.github.dkoval.leetcode.challenge.SumOfRootToLeafBinaryNumbers.SumOfRootToLeafBinaryNumbersRev2
45
import org.junit.jupiter.api.Assertions.assertEquals
6+
import org.junit.jupiter.api.Nested
7+
import org.junit.jupiter.api.extension.ExtensionContext
58
import org.junit.jupiter.params.ParameterizedTest
69
import org.junit.jupiter.params.provider.Arguments
7-
import org.junit.jupiter.params.provider.MethodSource
10+
import org.junit.jupiter.params.provider.ArgumentsProvider
11+
import org.junit.jupiter.params.provider.ArgumentsSource
12+
import org.junit.jupiter.params.support.ParameterDeclarations
13+
import java.util.stream.Stream
814

915
internal class SumOfRootToLeafBinaryNumbersTest {
1016

11-
companion object {
12-
@JvmStatic
13-
fun input(): List<Arguments> = listOf(
17+
class InputArgumentsProvider : ArgumentsProvider {
18+
19+
override fun provideArguments(
20+
parameters: ParameterDeclarations,
21+
context: ExtensionContext
22+
): Stream<out Arguments> = Stream.of(
1423
Arguments.of(
1524
TreeNode(1).apply {
1625
left = TreeNode(0).apply {
@@ -39,10 +48,28 @@ internal class SumOfRootToLeafBinaryNumbersTest {
3948
)
4049
}
4150

42-
@ParameterizedTest
43-
@MethodSource("input")
44-
fun `should return sum of root to leaf binary numbers`(root: TreeNode?, expected: Int) {
45-
val actual = SumOfRootToLeafBinaryNumbers.sumRootToLeaf(root)
46-
assertEquals(expected, actual)
51+
@Nested
52+
inner class SumOfRootToLeafBinaryNumbersRev1Test {
53+
54+
@ParameterizedTest
55+
@ArgumentsSource(InputArgumentsProvider::class)
56+
fun `should return sum of root to leaf binary numbers`(root: TreeNode?, expected: Int) {
57+
SumOfRootToLeafBinaryNumbersRev1.test(root, expected)
58+
}
59+
}
60+
61+
@Nested
62+
inner class SumOfRootToLeafBinaryNumbersRev2Test {
63+
64+
@ParameterizedTest
65+
@ArgumentsSource(InputArgumentsProvider::class)
66+
fun `should return sum of root to leaf binary numbers`(root: TreeNode?, expected: Int) {
67+
SumOfRootToLeafBinaryNumbersRev2().test(root, expected)
68+
}
4769
}
48-
}
70+
}
71+
72+
private fun SumOfRootToLeafBinaryNumbers.test(root: TreeNode?, expected: Int) {
73+
val actual = sumRootToLeaf(root)
74+
assertEquals(expected, actual)
75+
}

0 commit comments

Comments
 (0)