我试图使用zss库中的“Node”类型将数学表达式转换为二叉树结构。我使用这个特殊的“Node”类型是因为我想使用同一个库中的函数来计算树的编辑距离。在
数学表达式可以是不同的格式,例如(28+32),((75+2)-21+(94-90)),((53+67)/2),((40*51)/(86-52))等
树是二叉树。根节点总是一个运算符,叶总是数字。在
“Node”树结构总是节点(根节点,[leftChild,rightChild])。下面是一些如何在树中表示表达式的示例。在
以下是我的代码当前的操作(complete code):读入字符串表达式并将其拆分为标记
将运算符的索引存储在op_index中
情况1:当表达式类似(2+3)–有一个运算符(将运算符设置为top_运算符,对叶节点进行排序并将最低的分配给左树(因此(2+3)和(3+2)表达式将始终以相同的方式构建)
情况2:当表达式为like((2+3)*5)–有两个运算符(将运算符设置为top_运算符并对叶节点排序)
返回树def generateTree(bs):
item = bs.split()
op_index = []
top_operator = []
left_tree = []
right_tree = []
# stores the index of each operator in item list
for i in range(0, len(item)):
if item[i] in ['+', '-', '*', '/']:
op_index.append(i)
for n in op_index:
#case 1
if (len(op_index) == 1):
top_operator.append(item[n])
#a = Node(item[n - 1], [])
#b = Node(item[n + 1], [])
if(isLeftChildNodeSmaller(item[n-1], item[n+1]) == True):
left_tree.append(Node(item[n - 1], []))
right_tree.append(Node(item[n + 1], []))
else:
left_tree.append(Node(item[n + 1], []))
right_tree.append(Node(item[n - 1], []))
#case 2
elif (len(op_index) == 2):
if(isInt(item[n-1]) == True and isInt(item[n+1]) == True):
if (isLeftChildNodeSmaller(item[n - 1], item[n + 1]) == True):
c = Node(item[n],[Node(item[n - 1], []), Node(item[n + 1], [])])
else:
c = Node(item[n], [Node(item[n + 1], []), Node(item[n - 1], [])])
right_tree.append(c)
else:
top_operator.append(item[n])
if(isInt(item[n-1]) == True):
left_tree.append(Node(item[n-1],[]))
else:
left_tree.append(Node(item[n+1], []))
right_tree.append(a)
final_tree = Node(top_operator, [left_tree[0], right_tree[0]])
return final_tree
t1 = generateTree("( 2 + 1 )")
t2 = generateTree("( 5 + ( 2 + 1 ) )")
editDistance = simple_distance(t1,t2)
print(editDistance) # returns 2
我试着为两种表达式类型编写代码。不过,我正试图找出一种更通用的方法来编写它,因为当表达式变得更复杂时,很难以静态方式构建树。在