【数据结构】表达式树专题

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;
}
posted @   Tshaxz  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
Language: HTML
点击右上角即可分享
微信分享提示