【Leetcode】1597. Build Binary Expression Tree From Infix Expression
题目地址:
https://leetcode.com/problems/build-binary-expression-tree-from-infix-expression/
给定一个中缀表达式 s s s,里面含数字、左右括号和加减乘除,题目保证每个数字只有一个字符的长度。要求将其转为表达式树。
思路参考https://blog.csdn.net/qq_46105170/article/details/106212914。下面简要说明之:
首先规定各个运算符的优先级,这里左括号也视为运算符,其优先级为 1 1 1,加减优先级为 2 2 2,乘除为 3 3 3。维护一个符号栈,使得从栈底到栈顶运算符优先级严格上升,再开一个Node栈,来存Node。接着开始遍历 s s s:
1、遇到左括号,则入符号栈;
2、遇到数字,则new出节点入Node栈;
3、遇到右括号,则只要符号栈栈顶不是左括号,就从Node栈里pop两个Node出来分别作为右左孩子(注意,这里是右左孩子不是左右孩子,先pop的是右孩子,后pop的是左孩子),从符号栈里pop出一个运算符作为树根,连上左右孩子之后再push回Node栈;最后将左括号出栈;
4、遇到运算符,则只要符号栈栈顶的运算符优先级大于等于新来的运算符,就从Node栈里pop两个Node出来分别作为右左孩子,从符号栈里pop出一个运算符作为树根,连上左右孩子之后再push回Node栈。
最后,如果发现Node栈size不为 1 1 1,就再进行上面的pop两次连树根的操作,直到Node栈size为 1 1 1。最后这个留在栈里的Node即为所求。代码如下:
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;public class Solution {public Node expTree(String s) {Map<Character, Integer> prio = new HashMap<>();prio.put('(', 1);prio.put('+', 2);prio.put('-', 2);prio.put('*', 3);prio.put('/', 3);Deque<Character> ops = new ArrayDeque<>();Deque<Node> stack = new ArrayDeque<>();for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);if (ch == '(') {ops.push(ch);} else if (Character.isDigit(ch)) {stack.push(new Node(ch));} else if (ch == ')') {while (ops.peek() != '(') {combine(ops, stack);}// pop掉左括号ops.pop();} else {while (!ops.isEmpty() && prio.get(ops.peek()) > prio.get(ch)) {combine(ops, stack);}ops.push(ch);}}while (stack.size() > 1) {combine(ops, stack);}return stack.peek();}private void combine(Deque<Character> ops, Deque<Node> stack) {Node root = new Node(ops.pop());// 先pop的是右孩子,然后是左孩子root.right = stack.pop();root.left = stack.pop();stack.push(root);}
}class Node {char val;Node left, right;public Node(char val) {this.val = val;}
}
时空复杂度 O ( n ) O(n) O(n)。
【Leetcode】1597. Build Binary Expression Tree From Infix Expression相关推荐
- 【leetcode】654. Maximum Binary Tree
题目如下: Given an integer array with no duplicates. A maximum tree building on this array is defined as ...
- 【LeetCode】971. Flip Binary Tree To Match Preorder Traversal
题目地址: 971. Flip Binary Tree To Match Preorder Traversal 解析 本题是关于二叉树翻转的题目,给定一个二叉树,对于其中的一个节点的翻转定义为该节点的 ...
- 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...
- 【LeetCode】513. Find Bottom Left Tree Value
问题描述 问题链接:https://leetcode.com/problems/find-bottom-left-tree-value/#/description Given a binary tre ...
- 【leetcode】109. Convert Sorted List to Binary Search Tree
题目如下: Given a singly linked list where elements are sorted in ascending order, convert it to a heigh ...
- 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java
[LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...
- 【LeetCode】863. All Nodes Distance K in Binary Tree 解题报告(Python)
[LeetCode]863. All Nodes Distance K in Binary Tree 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...
- 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)
[LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】...
[109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...
最新文章
- Android渗透测试Android渗透测试入门教程大学霸
- php.ini 中文英文对照详细配置手册
- Class.forName解析以及使用
- 实验三_166_张珍珍
- CodeBlocks问题解决
- ASP.NET(C#)获取客户端的网卡MAC代码
- C++全局变量的声明和定义
- python数值积分_python实现数值积分的Simpson方法实例分析
- 互联网常用系统监控工具
- 【Vegas原创】IPAD忘记密码重置恢复出厂设置
- 奥克兰大学商学院计算机专业,奥克兰大学的商科专业 推荐三大专业
- 互联网诞生记: 浪成于微澜之间
- python+Selenium自动化操作Chrome模拟手机浏览器
- 【云原生 | Docker 基础篇】03、Docker 阿里云镜像加速器
- IBM创磁带存储新纪录
- xmind可以画流程图吗_怎样用XMind方便地制作流程图
- Linux下安装google浏览器
- 使用motan+Zookeeper构建RPC服务
- 线性代数库 Armadillo 学习笔记
- Shannon理论——笔记1