【数据结构】表达式树专题
3765. 表达式树
将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。
/**
* Definition for a binary tree node.
* struct TreeNode {
* string val;
* TreeNode *left;
* TreeNode *right;
* };
*/
class Solution {
public:
string res;
void dfs(TreeNode* root)
{
if(!root) return;
if(!root->left && !root->right) res += root->val;
else
{
res += '(';
dfs(root->left);
res += root->val;
dfs(root->right);
res += ')';
}
}
string expressionTree(TreeNode* root) {
dfs(root->left);
res += root->val;
dfs(root->right);
return res;
}
};
1623. 中缀表达式
给定一个句法二叉树,请你输出相应的中缀表达式,并利用括号反映运算符的优先级。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 25;
int n;
string v[N];
int l[N], r[N];
bool st[N], is_leaf[N];
string dfs(int u)
{
string left, right;
if(l[u] != -1)
{
left = dfs(l[u]);
if(!is_leaf[l[u]]) left = '(' + left + ')';
}
if(r[u] != -1)
{
right = dfs(r[u]);
if(!is_leaf[r[u]]) right = '(' + right + ')';
}
return left + v[u] + right;
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i ++ )
{
cin >> v[i] >> l[i] >> r[i];
if(l[i] != -1) st[l[i]] = true;
if(r[i] != -1) st[r[i]] = true;
if(l[i] == -1 && r[i] == -1) is_leaf[i] = true;
}
int root = 1;
while(st[root]) root ++ ; // 找根节点
// for(int i = 1; i <= n; i ++ ) //找根节点写法二
// if(!st[i])
// root = i;
cout << dfs(root) << endl;
return 0;
}
4274. 后缀表达式
给定一个二叉表达式树,请你输出相应的后缀表达式,要求使用括号反映运算符的优先级。
即输出一棵二叉表达式树的后序遍历序列
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 25;
int n;
string v[N];
int l[N], r[N];
bool st[N];
void dfs(int u)
{
cout << '(';
if(l[u] != -1 && r[u] != -1) //左右儿子都不空,后序遍历
{
dfs(l[u]);
dfs(r[u]);
cout << v[u];
}
else if(l[u] == -1 && r[u] != -1) // 只有右儿子,说明是负号
{
cout << v[u]; //输出负号
dfs(r[u]); // 遍历右儿子
}
else if(l[u] == -1 && r[u] == -1) // 叶子节点
{
cout << v[u];
}
cout << ')';
}
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i ++ )
{
cin >> v[i] >> l[i] >> r[i];
if(l[i] != -1) st[l[i]] = true;
if(r[i] != -1) st[r[i]] = true;
}
int root;
for(int i = 1; i <= n; i ++ )
if(!st[i])
root = i;
dfs(root);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程