\$\begingroup\$
\$\endgroup\$
2
Here is my solution for the Daily Coding Challenge 50
Given an arithmetic expression in the form of a binary tree, write a function to evaluate it
Example
*
/ \
+ +
/ \ / \
3 2 4 5
Return >> 45
Is this the most efficient way to do this?
"""Build an operation tree and calculate the result"""
class Tree:
def __init__(self, value, left=None, right=None):
"""Initialise values"""
self.value = value
self.left = left
self.right = right
def determine_sum(self, total):
if self.left == None and self.right == None:
return int(self.value)
if self.value == "*":
total += self.left.determine_sum(total) * self.right.determine_sum(total)
if self.value == "+":
total += self.left.determine_sum(total) + self.right.determine_sum(total)
if self.value == "-":
total += self.left.determine_sum(total) - self.right.determine_sum(total)
if self.value == "/":
total += self.left.determine_sum(total) / self.right.determine_sum(total)
return total
if __name__ == "__main__": #
n = Tree("*")
n.left = Tree("+")
n.right = Tree("+")
n.left.right = Tree("+")
n.right.right = Tree("+")
n.left.left = Tree("3")
n.left.right.left = Tree("4")
n.left.right.right = Tree("5")
n.right.left = Tree("6")
n.right.right.left = Tree("7")
n.right.right.right = Tree("4")
sum = n.determine_sum(0)
print(sum)
200_success
145k22 gold badges190 silver badges478 bronze badges
-
\$\begingroup\$ In what sense is this a binary search tree? \$\endgroup\$200_success– 200_success2019年06月26日 21:14:29 +00:00Commented Jun 26, 2019 at 21:14
-
\$\begingroup\$ Sorry. Binary tree. My apologies \$\endgroup\$MrJoe– MrJoe2019年06月26日 21:19:04 +00:00Commented Jun 26, 2019 at 21:19
1 Answer 1
\$\begingroup\$
\$\endgroup\$
2
dict
>if
soperator
contains all the functions you need.- Taking
total
as an argument is unneeded. - I would personally split the 'Tree' which is actually a Node into two types, operators and values. But that may go against the challenge.
- Use
is
to compare toNone
.
import operator
operators = {
'*': operator.mul,
'+': operator.add,
'-': operator.sub,
'/': operator.truediv,
}
class Tree:
def __init__(self, value, left=None, right=None):
"""Initialise values"""
self.value = value
self.left = left
self.right = right
def determine(self):
if self.left is None and self.right is None:
return int(self.value)
return operators[self.value](
self.left.determine(),
self.right.determine()
)
answered Jun 26, 2019 at 20:37
-
\$\begingroup\$ You never fail to amaze with with how succinctly you write code. Thanks \$\endgroup\$MrJoe– MrJoe2019年06月26日 20:41:41 +00:00Commented Jun 26, 2019 at 20:41
-
2\$\begingroup\$ @EML With time you'll be able to too :) You'll be able to see common pitfalls that you know how to fix without even thinking. \$\endgroup\$2019年06月26日 21:03:59 +00:00Commented Jun 26, 2019 at 21:03
lang-py