算术表达式转换为以二叉树的结构存储

算术表达式转换为以二叉树的结构存储

#include <iostream>
#include <malloc.h>

using namespace std;

typedef struct BiTNode
{
    char data;
    BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

/**
afa:指向表达式字符串的指针
s:为要装换的表达式字符串的起始位置
e:为要装换的表达式字符串的结束位置的后一位
local_r:记录当前要转化的表达式生成二叉树的根节点操作符的位置
flag:记录是否是当前搜索在括号里面
m_m_p:记录当前表达式中括号外面最右端的*、/、^位置
a_s_p:记录当前表达式中括号外面最右端的+、-位置
**/
BiTree afaToBiTree(char *afa, int s, int e)
{
    //如果只有一个数,那就是叶子节点
    if(e-s==1)
    {
        BiTree bn = (BiTree)malloc(sizeof(BiTNode));
        bn->data = afa[s];
        bn->lchild = NULL;
        bn->rchild = NULL;
       // cout << "aaa";
        return bn;
    }

    int local_r = 0;
    int flag = 0;
    int m_m_p = 0;
    int a_s_p = 0;
    for(int i = s; i < e; i++)
    {
        if(afa[i] == '(')
        {
            flag++;
        }
        else if(afa[i] == ')')
        {
            flag--;
        }

        if(flag == 0)
        {
            if(afa[i] == '*' || afa[i] == '/' || afa[i] == '^')
            {
                m_m_p = i;
            }
            else if(afa[i] == '+' || afa[i] == '-')
            {
                a_s_p = i;
            }
        }
    }

    if((m_m_p == 0) && (a_s_p == 0))
    {
        //如果整式整个有括号,即括号外面没有操作符,则去掉括号找二叉树
        afaToBiTree(afa, s+1, e-1);
    }
    else
    {
        //如果有+货-,则根节点为最右端的+或-,否则为最右端的*或/
        if(a_s_p > 0)
        {
            local_r = a_s_p;
        }
        else if(m_m_p > 0)
        {
            local_r = m_m_p;
        }

        //确定根节点和根节点的左右孩子
        BiTree b = (BiTree)malloc(sizeof(BiTNode));
        b->data = afa[local_r];
        b->lchild = afaToBiTree(afa, s, local_r);
        b->rchild = afaToBiTree(afa, local_r+1, e);
        return b;
    }
}

void visit(BiTree T)
{
    if(T)
    {
        cout << T->data;
    }
}

void PreOrderTraveral(BiTree T)
{
    if(T)
    {
        visit(T);
        PreOrderTraveral(T->lchild);
        PreOrderTraveral(T->rchild);
    }
}

void InOrderTraverse(BiTree T)
{
    if(T)
    {
       InOrderTraverse(T->lchild);
       visit(T);
       InOrderTraverse(T->rchild);
    }
}

void PostOrderTraverse(BiTree T)
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        visit(T);
    }
}

int main()
{
    BiTree T = NULL;
    char str[50];
    char *afa;
    int n;
    afa = str;
    for(int i = 0; i < 50; i++)
    {
        cin >> str[i];
        if(str[i] == '#')
        {
            n = i;
            break;
        }
    }
    T = afaToBiTree(afa, 0, n);
    PreOrderTraveral(T);
    cout << endl;
    InOrderTraverse(T);
    cout << endl;
    PostOrderTraverse(T);
    return 0;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是通过二叉链表遍历将算术表达式转换二叉树并求值的 C 语言代码,包含注释说明: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { char data; // 节点数据 struct TreeNode *left; // 左子节点 struct TreeNode *right; // 右子节点 } TreeNode; // 定义栈结构体 typedef struct Stack { TreeNode **items; // 存储节点指针的数组 int top; // 栈顶指针 int size; // 栈的最大容量 } Stack; // 创建一个新的栈 Stack *createStack(int size) { Stack *stack = (Stack *) malloc(sizeof(Stack)); stack->items = (TreeNode **) malloc(size * sizeof(TreeNode *)); stack->size = size; stack->top = -1; return stack; } // 判断栈是否为空 int isEmpty(Stack *stack) { return stack->top == -1; } // 判断栈是否已满 int isFull(Stack *stack) { return stack->top == stack->size - 1; } // 入栈操作 void push(Stack *stack, TreeNode *item) { if (isFull(stack)) { printf("Error: Stack is full\n"); return; } stack->items[++stack->top] = item; } // 出栈操作 TreeNode *pop(Stack *stack) { if (isEmpty(stack)) { printf("Error: Stack is empty\n"); return NULL; } return stack->items[stack->top--]; } // 获取栈顶元素 TreeNode *peek(Stack *stack) { if (isEmpty(stack)) { printf("Error: Stack is empty\n"); return NULL; } return stack->items[stack->top]; } // 判断一个字符是否是操作符 int isOperator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } // 通过二叉链表遍历将算术表达式转换二叉树 TreeNode *constructTree(char postfix[]) { int i = 0; Stack *stack = createStack(strlen(postfix)); while (postfix[i] != '\0') { char c = postfix[i]; if (isOperator(c)) { TreeNode *node = (TreeNode *) malloc(sizeof(TreeNode)); node->data = c; node->right = pop(stack); node->left = pop(stack); push(stack, node); } else { TreeNode *node = (TreeNode *) malloc(sizeof(TreeNode)); node->data = c; node->left = NULL; node->right = NULL; push(stack, node); } i++; } TreeNode *root = pop(stack); return root; } // 求二叉树的值 int evaluateTree(TreeNode *root) { if (root == NULL) { return 0; } if (root->left == NULL && root->right == NULL) { return root->data - '0'; // 将字符转换为数字 } int leftValue = evaluateTree(root->left); int rightValue = evaluateTree(root->right); switch (root->data) { case '+': return leftValue + rightValue; case '-': return leftValue - rightValue; case '*': return leftValue * rightValue; case '/': return leftValue / rightValue; default: printf("Error: Invalid operator %c\n", root->data); return 0; } } // 测试代码 int main() { char postfix[] = "23+45+*"; // 后缀表达式 "2+3*4+5" TreeNode *root = constructTree(postfix); int result = evaluateTree(root); printf("Result: %d\n", result); // 输出结果 25 return 0; } ``` 以上代码实现了通过二叉链表遍历将算术表达式转换二叉树并求值的功能,具体实现过程包括: 1. 定义二叉树节点结构体 `TreeNode`,包含节点数据和左右子节点指针; 2. 定义栈结构体 `Stack`,使用数组存储节点指针,并实现入栈、出栈、获取栈顶元素等操作; 3. 实现判断一个字符是否是操作符的函数 `isOperator`; 4. 实现通过二叉链表遍历将算术表达式转换二叉树的函数 `constructTree`,遍历表达式字符串,遇到操作数创建节点并入栈,遇到操作符弹出两个节点作为左右子节点创建新节点并入栈; 5. 实现求二叉树的值的函数 `evaluateTree`,递归遍历二叉树,遇到操作数返回该节点的值,遇到操作符递归计算左右子节点的值并根据操作符进行运算; 6. 在 `main` 函数中测试代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值