0
点赞
收藏
分享

微信扫一扫

LeetCode题解(1597):根据中缀表达式构造二叉表达式树(Python)


题目:​​原题链接​​(困难)

标签:树、二叉树、栈、字符串

解法

时间复杂度

空间复杂度

执行用时

Ans 1 (Python)

O ( N 2 )

O ( N )

612ms (100.00%)

Ans 2 (Python)

Ans 3 (Python)

解法一(栈):

class Solution:
def expTree(self, s: str) -> 'Node':
# 标记化字符串
# O(N)
tokens1 = []
for ch in s:
if ch in "+-*/()":
tokens1.append(ch)
else:
if tokens1 and tokens1[-1].isnumeric():
tokens1[-1] += ch
else:
tokens1.append(ch)

# 生成算术表达式树
stack = [[]]
for t in tokens1:
if t.isnumeric() or t in {"+", "-", "*", "/"}:
stack[-1].append(Node(t))
elif t == "(":
stack.append([])
elif t == ")":
node = self.build(stack.pop())
stack[-1].append(node)
# print([[str(e) for e in part] for part in stack])

return self.build(stack.pop())

def build(self, nodes):
# print("From:", [str(e) for e in nodes])

# 处理乘除号
stack1 = []
for node in nodes:
if node.val.isnumeric() and stack1 and stack1[-1].val in {"*", "/"}:
mark = stack1.pop()
sub1 = stack1.pop()
mark.left = sub1
mark.right = node
# print("New-Mark:", mark)
stack1.append(mark)
else:
stack1.append(node)

# print("Stack1:", [str(e) for e in stack1])

# 处理加减号
stack2 = []
for node in stack1:
stack2.append(node)
if len(stack2) >= 3:
sub2 = stack2.pop()
mark = stack2.pop()
sub1 = stack2.pop()
mark.left = sub1
mark.right = sub2
stack2.append(mark)

# print("Stack2:", [str(e) for e in stack2])

# print("Result:", stack2[-1])

return stack2.pop()



举报

相关推荐

0 条评论