[ANOJ]1015你们要的中缀表达式树

本文介绍了一种使用二叉树结构实现表达式求值的方法,并提供了完整的C++实现代码。通过递归中序遍历的方式,该方法能够处理包含括号的复杂表达式,适用于计算器等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 原题:https://logn.me/problem/1015

2. 思路:

题意:二叉树遍历题。
思路:
核心是中序遍历。
只是除最外层,都要加上括号输出。
值的计算问题,递归计算即可。
注意:计算的变量要用double,可能很大。
已AC

3. 源码:

#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
using namespace std;

struct Node
{
	Node() :left(-1), right(-1){}
	string da;
	int left, right;
};

int N, H[31] = { 0 }, T;
vector<Node> mv;

double in_order(int x);

int main()
{
	//ios::sync_with_stdio(false);
	//freopen("in.txt", "r", stdin);
	cin >> N;
	mv.resize(N);
	for (int i = 0; i < N; i++)
		cin >> mv[i].da;
	string sa, sb;
	for (int i = 0; i < N; i++)
	{
		cin >> sa >> sb;
		if (sa[0] != '-')
		{
			mv[i].left = atoi(sa.c_str()); //***字符串转数字
			H[mv[i].left] = 1;
		}
		if (sb[0] != '-')
		{
			mv[i].right = atoi(sb.c_str());
			H[mv[i].right] = 1;
		}
	}
	for (int i = 0; i < N; i++)
	{
		if (H[i] == 0)
		{
			T = i;	//***找出根节点
			break;
		}
	}
	printf(" %.2f\n", in_order(T));

	return 0;
}

double in_order(int x)
{
	if (mv[x].left < 0 && mv[x].right < 0) //***这里是叶子结点
	{
		cout << mv[x].da;
		return atof(mv[x].da.c_str());
	}

	double dl, dr;
	if (x != T)
		cout << "(";
	dl = in_order(mv[x].left);
	cout << mv[x].da;
	dr = in_order(mv[x].right);
	if (x != T)
		cout << ")";
	switch (mv[x].da[0])
	{
	case '+':
		return (dl + dr);
		break;
	case '-':
		return (dl - dr);
		break;
	case '*':
		return (dl * dr);
		break;
	case '/':
		return (dl / dr);
		break;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值