转换算术表达式

文章目录


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

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

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

相关推荐
磨十三11 分钟前
C++ 容器详解:std::list 与 std::forward_list 深入解析
开发语言·c++·list
今麦郎xdu_16 分钟前
【Linux系统】命令行参数和环境变量
linux·服务器·c语言·c++
chenchihwen1 小时前
深度解析RAG系统中的PDF解析模块:Docling集成与并行处理实践
python·算法·pdf
Chloeis Syntax2 小时前
栈和队列笔记2025-10-12
java·数据结构·笔记·
404未精通的狗2 小时前
(数据结构)线性表(下):链表分类及双向链表的实现
数据结构·链表
情深不寿3172 小时前
C++特殊类的设计
开发语言·c++·单例模式
做科研的周师兄2 小时前
【机器学习入门】7.4 随机森林:一文吃透随机森林——从原理到核心特点
人工智能·学习·算法·随机森林·机器学习·支持向量机·数据挖掘
Vanranrr2 小时前
nullptr vs NULL:C/C++ 空指针的演变史
c语言·c++
切糕师学AI3 小时前
【多线程】阻塞等待(Blocking Wait)(以C++为例)
c++·多线程·并发编程·阻塞等待
Sunsets_Red3 小时前
差分操作正确性证明
java·c语言·c++·python·算法·c#