Skip to content

Commit 1a574a7

Browse files
author
Mauricio Klein
committed
Add solution for challenge #57
1 parent ee0b444 commit 1a574a7

File tree

6 files changed

+86
-0
lines changed

6 files changed

+86
-0
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,4 @@
5656
- [x] [Challenge 54: Find the number of islands](challenge-54/)
5757
- [x] [Challenge 55: Merge list of number into ranges](challenge-55/)
5858
- [x] [Challenge 56: Find largest BST](challenge-56/)
59+
- [x] [Challenge 57: Arithmetic Binary Tree](challenge-57/)

Diff for: challenge-57/Makefile

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
test:
2+
python test_*.py
3+
4+
.PHONY: test

Diff for: challenge-57/README.md

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Arithmetic Binary Tree
2+
3+
This problem was asked by Apple.
4+
5+
## Description
6+
7+
You are given a binary tree representation of an arithmetic expression. In this tree, each leaf is an integer value, and a non-leaf node is one of the four operations: '+', '-', '*', or '/'.
8+
9+
Write a function that takes this tree and evaluates the expression.
10+
11+
## Example
12+
13+
```
14+
Input:
15+
*
16+
/ \
17+
+ +
18+
/ \ / \
19+
3 2 4 5
20+
21+
Output:
22+
45 # (3 + 2) * (4 + 5)
23+
```
24+

Diff for: challenge-57/__init__.py

Whitespace-only changes.

Diff for: challenge-57/solver.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
PLUS = '+'
2+
MINUS = '-'
3+
TIMES = '*'
4+
DIVIDE = '/'
5+
6+
class Node(object):
7+
def __init__(self, v, left=None, right=None):
8+
self.v = v
9+
self.left = left
10+
self.right = right
11+
12+
def is_operation(self):
13+
return self.v in (PLUS, MINUS, TIMES, DIVIDE)
14+
15+
#
16+
# Time complexity: O(n) (each node is evaluate at most once)
17+
# Space complexity: O(logn) (depth of the tree)
18+
#
19+
def evaluate(node):
20+
if node.is_operation():
21+
left = evaluate(node.left)
22+
right = evaluate(node.right)
23+
24+
return left + right if node.v == PLUS else \
25+
left - right if node.v == MINUS else \
26+
left * right if node.v == TIMES else \
27+
left / right
28+
else:
29+
return node.v

Diff for: challenge-57/test_solver.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import unittest
2+
import solver
3+
from solver import Node, evaluate
4+
5+
class TestSolver(unittest.TestCase):
6+
def test_evaluate(self):
7+
# Single sum: (15 + 5)
8+
root = Node(solver.PLUS, Node(15), Node(5))
9+
self.assertEqual(evaluate(root), 20)
10+
11+
# Single subtraction: (15 - 5)
12+
root = Node(solver.MINUS, Node(15), Node(5))
13+
self.assertEqual(evaluate(root), 10)
14+
15+
# Single multiplication: (15 * 5)
16+
root = Node(solver.TIMES, Node(15), Node(5))
17+
self.assertEqual(evaluate(root), 75)
18+
19+
# Single division: (15 / 5)
20+
root = Node(solver.DIVIDE, Node(15), Node(5))
21+
self.assertEqual(evaluate(root), 3)
22+
23+
# Chained operations: (3 + 2) * (4 + 5)
24+
root = Node(solver.TIMES, Node(solver.PLUS, Node(3), Node(2)), Node(solver.PLUS, Node(4), Node(5)))
25+
self.assertEqual(evaluate(root), 45)
26+
27+
if __name__ == "__main__":
28+
unittest.main()

0 commit comments

Comments
 (0)