python 删除算术表达式中多余的括号

wbrvyc0a  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(184)

我正在尝试从算术表达式中删除多余的括号。例如,如果我有一个表达式(5+((2*3))),我希望删除(2*3)之间多余的括号。我希望得到的输出是(5+(2*3))
我通过在表达式树上执行中序遍历得到这个算术表达式。执行遍历后得到的最终字符串是((5)+(((2)*(3))))。我使用re.sub('\((\d+)\)', r'\1', <traversal output string>)删除了数字之间的括号,如(5)5。但我仍然不清楚应该如何删除子表达式之间的括号(本例中为((2*3)))。
下面是我的inorder遍历函数

def inorder(tree):
        # return string of inorder traversal of tree with parenthesis
        s = ''
        if tree != None:
            s += '('
            s += ExpTree.inorder(tree.getLeftChild())
            s += str(tree.getRootVal())
            s += ExpTree.inorder(tree.getRightChild())
            s += ')'

        return re.sub('\((\d+)\)', r'\1', s)

任何关于我应该如何解决这个问题的指导将不胜感激!

pqwbnv8z

pqwbnv8z1#

除了在父/根表达式前后添加括号外,还有一种选择是在递归的左右子表达式前后添加括号。如果这些子表达式是叶表达式,意味着它们没有子表达式,则不添加括号。
实际上,这可能类似于:

def inorder(tree):
    # return string of inorder traversal of tree with parenthesis
    s = ''
    # Add left subtree, with parentheses if it is not a leaf
    left = tree.getLeftChild()
    if left is not None:
        if left.isLeaf():
            s += ExpTree.inorder(left)
        else:
            s += '(' + ExpTree.inorder(left) + ')'

    # Add root value
    s += str(tree.getRootVal())

    # Add right subtree, with parentheses if it is not a leaf
    right = tree.getRightChild()
    if right is not None:
        if right.isLeaf():
            s += ExpTree.inorder(right)
            else:
                s += '(' + ExpTree.inorder(right) + ')'
    return s

这意味着一棵只有一个节点5的树将变成"5",而下面的树

+
 / \
5   *
   / \
  2   3

将变成"5+(2*3)"

相关问题