Python 程序构建给定表达式的表达式树

pythonserver side programmingprogramming更新于 2024/2/18 18:36:00

表达式树是叶节点具有要操作的值,内部节点包含将对其执行叶节点的运算符的树。

示例:4 + ((7 + 9) * 2) 将具有如下表达式树 -

解决此问题的方法

为了为给定表达式构建表达式树,我们通常使用堆栈数据结构。首先,我们迭代给定的后缀表达式,并按照以下步骤进行操作 -

  • 如果我们在给定的表达式中获得一个操作数,则将其推送到堆栈中。它将成为表达式树的根。
  • 如果运算符在表达式中获得两个值,则将其添加到表达式树中作为其子节点,并将它们推送到当前节点。
  • 重复步骤 1 和步骤 2,直到我们无法完成给定的表达式。

示例

class stack:
   def __init__(self):
      self.arr = []
   def push(self, data):
      self.arr.append(data)
   def pop(self):
      try:
         return self.arr.pop(-1)
      except:
         pass
   def top(self):
      try:
         return self.arr[-1]
      except:
         pass
   def size(self):
      return len(self.arr)
# 表达式树的节点类
class node:
   def __init__(self, data):
      self.data = data
      self.left = None
      self.right = None
# 表达式树类
class exp_tree:
   def __init__(self, postfix_exp):
      self.exp = postfix_exp
      self.root = None
      self.createTree(self.exp)
   def isOperator(self, char):
      optr = [" ", "-", "*", "/", "^"]
      if char in optr: # 如果给定的 char 是运算符
         return True # 然后返回 true
      return False # 否则返回 false
   def createTree(self, exp):
      s = stack()
      # 存储所有子节点为 NULL 的运算符节点
      self.root = node(exp[-1])
      # 后缀表达式的最后一个字符始终是运算符
      s.push(self.root)
      # 继续执行后缀表达式的其余部分
      for i in "".join(reversed(exp[:-1])):
         curr_node = s.top()
           if not curr_node.right:
            # 如果当前节点的右节点为 NULL
            temp = node(i)
            curr_node.right = temp
            if self.isOperator(i):
             s.push(temp)
           else: # 如果当前节点的左节点为 NULL
            temp = node(i)
            curr_node.left = temp
            # 如果当前节点的所有子节点都不为 NULL
            s.pop() # 从堆栈中弹出当前节点
            if self.isOperator(i):
               s.push(temp)
   def inorder(self, head):
      # 表达式树的中序遍历
      # 中序遍历 = > left, root, right
      if head.left:
         self.inorder(head.left)
      print(head.data, end=" ")
      if head.right:
         self.inorder(head.right)
   def infixExp(self):
      # 表达式树的中序遍历给出中缀表达式
      self.inorder(self.root)
      print()
if __name__ == "__main__":
   postfixExp = "ab ef*g*-"
   et = exp_tree(postfixExp)
   et.infixExp()

运行上述代码将生成如下输出,

输出

(a + b - e * f * g)

解释:

根据给定的表达式构建树将生成输出,使得操作数将成为节点的根,其余数字将成为表达式树的子节点。


相关文章