嗨,這段代碼應該計算二進制三并輸出 45。問題是 var 運算式在輸出之前被重置。太計算總和可以用eval(…)。???????????????????????????????????????????????????????????????????????????????????????????????????????????
def __init__(self, val, left = None, right = None):
self.val=val
self.left=left
self.right=right
PLUS = " "
MINUS = "-"
TIMES = "*"
DIVIDE = "/"
expression = ''
def evaluate(root, Node='M'):
global expression
operators = (PLUS, MINUS, TIMES, DIVIDE)
if root:
evaluate(root.left, 'L')
if root.val in operators or Node == 'M':
a, b = '', ''
elif Node == 'L':
a, b = '(', ''
elif Node == 'R':
a, b = '', ')'
expression = a str(root.val) b
evaluate(root.right, 'R')
else:
print(expression, Node)
return expression
print(expression, Node)
# *
# / \
#
# / \ / \
# 3 2 4 5
tree = Node(TIMES)
tree.left = Node(PLUS)
tree.left.left = Node(3)
tree.left.right = Node(2)
tree.right = Node(PLUS)
tree.right.left = Node(4)
tree.right.right = Node(5)
print(evaluate(tree))
#45
uj5u.com熱心網友回復:
不要使用global; 它使您的狀態不被覆寫變得非常困難。你可以用一個非常簡單的遞回函式來做到這一點:
operators = {
PLUS: int.__add__,
MINUS: int.__sub__,
TIMES: int.__mul__,
DIVIDE: int.__floordiv__,
}
def evaluate(root: Node) -> int:
if isinstance(root.val, int):
return root.val
return operators[root.val](
evaluate(root.left),
evaluate(root.right)
)
tree = Node(TIMES)
tree.left = Node(PLUS)
tree.left.left = Node(3)
tree.left.right = Node(2)
tree.right = Node(PLUS)
tree.right.left = Node(4)
tree.right.right = Node(5)
print(evaluate(tree)) # 45
如果您還希望它生成運算式的字串形式,請將該部分作為回傳值而不是使用副作用:
def evaluate(root: Node) -> typing.Tuple[str, int]:
if isinstance(root.val, int):
return str(root.val), root.val
le, ln = evaluate(root.left)
re, rn = evaluate(root.right)
return f"({le} {root.val} {re})", operators[root.val](ln, rn)
tree = Node(TIMES)
tree.left = Node(PLUS)
tree.left.left = Node(3)
tree.left.right = Node(2)
tree.right = Node(PLUS)
tree.right.left = Node(4)
tree.right.right = Node(5)
print(*evaluate(tree), sep=" = ") # ((3 2) * (4 5)) = 45
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485507.html
標籤:Python python-3.x 二叉树
下一篇:結構模式匹配中的可選匹配
