转换算术表达式

文章目录


构造二叉树表示的算术表达式:按先序次序输入二叉树中结点的值(操作数及运算符均以一位字符表示,注意转换),

'#'字符表示空树,如上图的算术表达式

输入+2##*3##4##

输入格式

第一行输入表示要计算的算术表达式的二叉树结点的先序遍历序列,空树用#表示

输出格式

第一行输出该算术表达式的值

输入样例

+2##*3##4##

输出样例

14

部分代码如下:

c 复制代码
#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK  1
#define ERROR  0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int  Status;

const int MAXN = 1000;
int lch[MAXN],rch[MAXN];
char op[MAXN];
char input[MAXN];
int nc=0;

typedef char  ElemType;
typedef struct BiTNode
{
    ElemType data;
    struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
ElemType Calculate(BiTree T){
    int value = 0;
	BiTNode *p = T;    //创建指针指向根结点
	ElemType val_l, val_r;
	if(T){
		val_l = Calculate(p->lchild);    //递归计算左、右子树
		val_r = Calculate(p->rchild);
		switch(p->optr){        //根据根节点的字符将左右子结果计算为当前这一层子树的结果
			case'+':
				value = val_l + val_r;
				break;
			case'-':
				value = val_l - val_r;
				break;
			case'*':
				value = val_l * val_r;
				break;
			case'/':
				value = val_l / val_r;
				break;
			default:
				break;
		}
	}
	return value;
}

Status CreateBiTree(BiTree &T)    // 算法6.4
{
    // 按先序次序输入二叉树中结点的值(一个字符),'#'字符表示空树,
    // 构造二叉链表表示的二叉树T。
    char ch;
    scanf("%c",&ch);
    if (ch=='#') T = NULL;
    else
    {
        if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
        T->data = ch; // 生成根结点
        CreateBiTree(T->lchild);   // 构造左子树
        CreateBiTree(T->rchild);  // 构造右子树
    }
    return OK;
}

int main()   //主函数
{
    BiTree T;
    CreateBiTree(T);
    printf("%d\n",Calculate(T));
    return 0;
}//main

代码如下:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
struct TreeNode
{
    char value;
    struct TreeNode* left;
    struct TreeNode* right;
};

int calculate(struct TreeNode* root)
{
    if (root == NULL)
    {
        return 0;
    }
    if (root->left == NULL && root->right == NULL)
    {
        return root->value - '0';
    }
    int left = calculate(root->left);
    int right = calculate(root->right);
    switch (root->value)
    {
    case '+':
        return left + right;
    case '-':
        return left - right;
    case '*':
        return left * right;
    case '/':
        return left / right;
    default:
        return 0;
    }
}

struct TreeNode* createNode(char value)
{
    struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    node->value = value;
    node->left = NULL;
    node->right = NULL;
    return node;
}

struct TreeNode* buildTree()
{
    char value = getchar();
    if (value == '#')
    {
        return NULL;
    }
    struct TreeNode* node = createNode(value);
    node->left = buildTree();
    node->right = buildTree();
    return node;
}

int main()
{
    struct TreeNode* root = buildTree();
    printf("%d\n", calculate(root));
    return 0;
}

相关推荐
笑鸿的学习笔记1 分钟前
qt-C++笔记之setCentralWidget的使用
c++·笔记·qt
绝无仅有32 分钟前
企微审批对接错误与解决方案
后端·算法·架构
无限远的弧光灯1 小时前
c语言学习_函数递归
c语言·开发语言·学习
苏克贝塔1 小时前
Qt 图形视图框架3-事件处理与传播
c++·qt
用户5040827858391 小时前
1. RAG 权威指南:从本地实现到生产级优化的全面实践
算法
轩情吖1 小时前
Qt的信号与槽(二)
数据库·c++·qt·信号·connect·信号槽·
胖大和尚2 小时前
C++项目学习计划
开发语言·c++·学习
小林C语言2 小时前
C语言 | 指针小结
c语言
Python×CATIA工业智造3 小时前
详细页智能解析算法:洞悉海量页面数据的核心技术
爬虫·算法·pycharm