我正在尝试使用zss库中的“Node”类型将数学表达式转换为二叉树结构。我正在使用这种特殊的“节点”类型,因为我想使用同一个库中的函数来计算树编辑距离。
数学表达式可以采用不同的格式,例如(28 + 32),(((75 + 2) - 21)+(94 - 90)),((53 + 67)/ 2),((40 * 51)/(86 - 52))等
树是二叉树。根节点始终是运算符,叶子始终是数字。
“Node”树结构总是节点(root_node,[leftChild,rightChild])。以下是表达式如何在树中表示的几个示例。
以下是我的代码目前所做的事情(complete code):
将运营商的索引存储在op_index
案例1:当表达式类似于(2 + 3)时 - 有一个运算符(将运算符设置为top_operator,对叶节点进行排序并将最低的树分配给左侧树(因此(2 + 3) )和(3 + 2)表达式将始终以相同的方式构建))
案例2:当表达式如((2 + 3)* 5) - 有两个运算符(将运算符设置为top_operator并对叶节点进行排序)
返回树
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
我尝试编写两种表达式类型的代码。但是我试图找出一种以更通用的方式编写它的方法,因为当表达式变得更复杂时,很难以静态方式构建树。