转换算术表达式

文章目录


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

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

输入+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;
}

相关推荐
QiLinkOS35 分钟前
第三视觉理解徐玉生与他的商业活动(30)
大数据·c++·人工智能·算法·开源协议
mit6.8241 小时前
阅读的核心,是再读
c++
疯狂打码的少年1 小时前
【操作系统】页面置换算法(OPT/FIFO/LRU)
算法
小O的算法实验室1 小时前
2026年CIE,优化客货协同运输:综合地铁系统的列车容量动态分配
算法
Coder_Shenshen2 小时前
西门子S7CommPlus协议鉴权算法原理与流程详解
网络·后端·算法
硕风和炜3 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集
upgrador3 小时前
基础知识:C++ STL构造函数的左闭右开惯例及其实现原理
开发语言·c++
我是一颗柠檬4 小时前
【Java项目技术亮点】加权轮询负载均衡算法
java·算法·负载均衡
灯厂码农4 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法
wuyk5554 小时前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机