当前位置: 首页 > ai >正文

生成运算树

题目

题目描述

在某种脚本语言里,有一个形如 x+(a+pi-xn)+eps 的运算表达式,该表达式由以下元素构成:

  • 操作数:所有操作数均为变量,变量名由全小写字母组成,且长度不超过 10 个字符。
  • 操作符:仅存在 +- 这两种双目运算符。
  • 括号:用于改变运算的优先级。当运算优先级相同时,表达式从左至右进行计算。

给出一个运算表达式 calExpression,为便于计算,需将其转化为二叉树的表达形式。树中每个子树的计算结果会用于更上层子树的计算,以此清晰展示运算次序。最后按先序遍历方式输出树的节点序列。

示例

例如,某个运算表达式转换为相应的运算树(此处因无法直接展示图片,您可根据描述自行想象)。

输入

输入为运算表达式 calExpression,此表达式仅包含小写字母以及 +-() 字符,字符串长度不超过 1000。用例确保输入的字符串是一个合法的运算表达式。

输出

输出为一个字符串数组,数组里每个元素的值为节点中的操作数或者运算符。

算法标签: 二叉树, d f s dfs dfs, 模拟, *递归下降算法

思路

将整个表达式根据操作符分解, 如果遇到括号构建子树, 按照递归的形式进行建树, 然后直接进行 p r e pre pre遍历

具体的逻辑就是首先处理整个表达式, 按照左边表达式, 中间操作符, 右边表达式进行处理, 如果当前位置是运算符, 那么解析左右两个表达式, 然后构建树的节点
然后对于解析过程中如果出现了括号中的表达式, 需要调用 b u i l d build build函数进行处理构建出括号中的表达式如果不是表达式说明就是变量, 返回变量节点即可

代码

#include <algorithm>
#include <cstring>
#include <string>
#include <vector>using namespace std;struct Node {string val;Node *ls;Node *rs;Node(string v) : val(v), ls(nullptr), rs(nullptr) {}Node(string v, Node *l, Node *r) : val(v), ls(l), rs(r) {}
};string s;
int i = 0;
vector<string> ans;Node *parse();Node *build();//获取当前字符
char get() {while (i < s.size() && s[i] == ' ') i++;if (i >= s.size()) return '\0';return s[i];
}//获取当前位置的字符, 并且向后样移动以一位
char move() {char c = get();if (c != '\0') i++;return c;
}// 获取变量名
string get_var() {string res;while (isalpha(get())) res += move();return res;
}//如果当前位置是括号中的表达式, 将括号中表达式构建为一棵树, 否则就是变量, 构建变量节点
Node *parse() {if (get() == '(') {move();Node *u = build();if (get() == ')') move();return u;} else {string val = get_var();return new Node(val);}
}//递归的构建树
Node *build() {Node *ls = parse();while (true) {char op = get();if (op == '+' || op == '-') {move();Node *rs = parse();//构造当前节点Node *u = new Node(string(1, op), ls, rs);ls = u;} else break;}return ls;
}//前序遍历累加答案
void pre_dfs(Node *u) {if (u == nullptr) return;ans.push_back(u->val);pre_dfs(u->ls);pre_dfs(u->rs);
}void delete_tree(Node *root) {if (root == nullptr) return;delete_tree(root->ls);delete_tree(root->rs);delete root;
}class Solution {
public:vector<string> GetExpressionTree(const string &calExpression) {s = calExpression;i = 0;ans.clear();Node *root = build();pre_dfs(root);delete_tree(root);return ans;}
};

*后续 A C AC AC代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>using namespace std;string s;
int i = 0;
vector<string> ans;
struct Node {string val;Node *ls, *rs;Node (string v) : val(v), ls(nullptr), rs(nullptr) {};Node (string v, Node *l, Node *r) : val(v), ls(l), rs(r) {};
};Node *build();
Node *parse();char get() {while (i < s.size() && s[i] == ' ') i++;if (i > s.size()) return '\0';return s[i];
}char move() {char c = get();if (c != '\0') i++;return c;
}string get_var() {string res;while (isalpha(get())) res += move();return res;
}Node *build() {Node *ls = parse();while (true) {char op = get();if (op == '+' || op == '-') {move();Node *rs = parse();Node *u = new Node(string(1, op), ls, rs);ls = u;}else break;}return ls;
}Node *parse() {if (get() == '(') {move();Node *u = build();if (get() == ')') move();return u;}else {string val = get_var();return new Node(val);}
}void dfs(Node *u) {if (u == nullptr) return;ans.push_back(u->val);dfs(u->ls);dfs(u->rs);
}void del(Node *u) {if (u == nullptr) return;del(u->ls);del(u->rs);delete u;
}class Solution {
public:vector<string> GetExpressionTree(const string &calExpression) {s = calExpression;i = 0;ans.clear();Node *u = build();dfs(u);del(u);return ans;}
};
http://www.xdnf.cn/news/1740.html

相关文章:

  • AIP代码生成器——标准化接口开发智能工具
  • SpringMVC知识体系
  • 【MySQL数据库入门到精通-06 DCL操作】
  • 《数据结构之美--栈和队列》
  • 三格电子Profinet从站转EtherNet/IP从站网关:工业通信协议转换的桥梁
  • 每日Python 4.24
  • 动态自适应分区算法(DAPS)设计流程详解
  • 深度学习:迁移学习
  • 2025年04月24日Github流行趋势
  • 那些年开发踩过的坑
  • day002
  • C++/Qt中QActionGroup类用法
  • 100.HTB-Meow
  • Redis高级数据类型解析(二)——Set、Sorted Set与Geo实战指南
  • 怎么设定自动化测试目标?
  • AI打开潘多拉魔盒?当深度伪造成为虚假信息的核动力引擎
  • RAG 的完整流程是怎么样的?
  • 【扣子Coze 智能体案例四】五行八卦占卜智能体
  • ESP32_IDF_VScode安装多版本共存
  • MySQL-自定义函数
  • 济南国网数字化培训班学习笔记-第二组-2节-输电线路施工及质量
  • Spring MVC HandlerAdapter 的作用是什么? 为什么 DispatcherServlet 不直接调用 Controller 方法?
  • Redis Cluster 使用 CRC16 算法实现 Slot 槽位分片的核心细节
  • VocalPitchMonitor汉化版:专业音调检测,助力歌唱练习
  • 从零开始在Win上添加一块QEMU开发板(四)实现简单USART
  • Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开
  • C++ 类与对象(上):从基础定义到内存布局的深度解析
  • PowerToys:让你的windows拥有更丝滑的体验
  • java多线程(3.0)
  • Redis从入门到上手-全面讲解redis使用.