1597. 根据中缀表达式构造二叉表达式树 🔒
题目描述
二叉表达式树 是一种表达算术表达式的二叉树。二叉表达式树中的每一个节点都有零个或两个子节点。 叶节点(有 0 个子节点的节点)表示操作数,非叶节点(有 2 个子节点的节点)表示运算符: '+'
(加)、 '-'
(减)、 '*'
(乘)和 '/'
(除)。
对于每一个运算符为 o
的非叶节点,对应的 中缀表达式 为 (A o B)
,其中 A
是左子树所表达的表达式, B
是右子树所表达的表达式。
给定一个 中缀表达式 字符串 s
,其中包含操作数、上面提到的运算符,以及括号 '('
与 ')'
。
返回一个有效的 二叉表达式树,其 中序遍历 序列对应表达式 s
消除括号后的序列(详情参见下面的示例)。
注意,表达式的一般解析顺序适用于 s
,即优先解析括号内的表达式,然后解析乘除法,最后解析加减法。
同时,操作数在 s
和树的中序遍历中 出现顺序相同 。
示例 1:
输入:s = "3*4-2*5" 输出:[-,*,*,3,4,2,5] 解释:上面是唯一一种有效的二叉表达式树,其中序遍历生成 s 。
示例 2:
输入:s = "2-3/(5*2)+1" 输出:[+,-,1,2,/,null,null,null,null,3,*,null,null,5,2] 解释:上面的树的中序遍历为 2-3/5*2+1 ,与 s 消除括号后相同。该树还会生成正确的结果,其操作数的顺序与 s 中出现的顺序相同。 下面的树也是一个有效的二叉表达式树,具有与 s 相同的中序遍历,但它不是一个有效的答案,因为它的求值结果不同。 下面的树也是无效的。尽管它的计算结果相等并与上述树等效,但其中序遍历不会产生 s ,并且其操作数与 s 中的顺序也不相同。
示例 3:
输入:s = "1+2+3+4+5" 输出:[+,+,5,+,4,null,null,+,3,null,null,1,2] 解释:二叉树 [+,+,5,+,+,null,null,1,2,3,4] 也是诸多有效的二叉表达式树之一。
提示:
1 <= s.length <= 100
s
中包含数字和字符'('
、')'
、'+'
、'-'
、'*'
、'/'
。s
中的操作数 恰好 是一位数字。- 题目数据保证
s
是一个有效的表达式。
解法
方法一
1 |
|
1 |
|
1 |
|
1 |
|