题目地址:

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相关推荐

  1. 【leetcode】654. Maximum Binary Tree

    题目如下: Given an integer array with no duplicates. A maximum tree building on this array is defined as ...

  2. 【LeetCode】971. Flip Binary Tree To Match Preorder Traversal

    题目地址: 971. Flip Binary Tree To Match Preorder Traversal 解析 本题是关于二叉树翻转的题目,给定一个二叉树,对于其中的一个节点的翻转定义为该节点的 ...

  3. 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal

    Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...

  4. 【LeetCode】513. Find Bottom Left Tree Value

    问题描述 问题链接:https://leetcode.com/problems/find-bottom-left-tree-value/#/description Given a binary tre ...

  5. 【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 ...

  6. 【LeetCode】Minimum Depth of Binary Tree 二叉树的最小深度 java

    [LeetCode]Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum dept ...

  7. 【LeetCode】863. All Nodes Distance K in Binary Tree 解题报告(Python)

    [LeetCode]863. All Nodes Distance K in Binary Tree 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...

  8. 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)

    [LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...

  9. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】...

    [109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...

最新文章

  1. Android渗透测试Android渗透测试入门教程大学霸
  2. php.ini 中文英文对照详细配置手册
  3. Class.forName解析以及使用
  4. 实验三_166_张珍珍
  5. CodeBlocks问题解决
  6. ASP.NET(C#)获取客户端的网卡MAC代码
  7. C++全局变量的声明和定义
  8. python数值积分_python实现数值积分的Simpson方法实例分析
  9. 互联网常用系统监控工具
  10. 【Vegas原创】IPAD忘记密码重置恢复出厂设置
  11. 奥克兰大学商学院计算机专业,奥克兰大学的商科专业 推荐三大专业
  12. 互联网诞生记: 浪成于微澜之间
  13. python+Selenium自动化操作Chrome模拟手机浏览器
  14. 【云原生 | Docker 基础篇】03、Docker 阿里云镜像加速器
  15. IBM创磁带存储新纪录
  16. xmind可以画流程图吗_怎样用XMind方便地制作流程图
  17. Linux下安装google浏览器
  18. 使用motan+Zookeeper构建RPC服务
  19. 线性代数库 Armadillo 学习笔记
  20. Shannon理论——笔记1

热门文章

  1. 基于vue3开发一个北京当地特色浏览网站
  2. C语言 利用位运算实现奇校验
  3. 51单片机 PWM LED灯亮度调节+Proteus仿真
  4. iOS app瘦身优化之路
  5. 续集:OLT中的ONU终端数据的自动下发实现方法(光猫数据自动下发)
  6. python爬虫工程师需要会什么软件_Python学习教程:爬虫工程师必备的10个爬虫工具!...
  7. Java实现二分图的最大匹配
  8. flex-basis
  9. SpringBoot正常启动后,却无法访问
  10. 尚硅谷JavaScript学习笔记